2012-12-10 3 views
21

hereの動作を実装しようとしています。通知(または何でも)がアプリ内で「内部」アクティビティを開始し、ユーザーが押したときに移動します私の "家"活動。通知作成アクティビティからメインアクティビティに戻る

Androidのドキュメントは、[戻る]ボタンの場合は

を言うには、タスクの背中に挿入することによりナビゲーションがより 予測可能にする必要があり、アプリの一番上の画面への完全な 上向きのナビゲーションパスを積み重ねます。これにより、ユーザーが終了する前にアプリの 一番上の画面にナビゲートする方法を忘れてしまったユーザー が許可されます。

実際に行うには良い方法がありますか? Stackoverflowに関するその他の質問は、内部活動を開始するように指示する目的でメインアクティビティを開始することを提案していますが、GoogleがGmailで使用していたと思われる巨大なハッキングのように思えます。彼らは行動を主張している。

これは非ハックな方法ですか?

答えて

55

ああ、私は単にgetActivity()の代わりにPendingIntent.getActivities()を使用するだけです。また、言及する価値がここTaskStackBuilder

あるいくつかのコードです:

Intent backIntent = new Intent(ctx, MainActivity.class); 
    backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

    Intent intent = new Intent(ctx, ConversationActivity.class); 
    intent.putExtra("whatever", whatever); 
    final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++, 
      new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT); 

はちょうどそれをテストしました。それは魅力のように働く。私は当初、アプリが既に稼働していて、あなたが通知に行くと問題が発生する可能性があると思っていました。私。

[MainActivity] [SomeActivity] 

、あなたはConversationActivityの通知をクリックして:あなたは(右側の一番上)で活動スタックと言います。あなたは?まあ

[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity] 

、それはあなたが魔法の私が欲しかったものですが、私はそれはそれをどうするかは考えている

[MainActivity] [SomeActivity] [ConversationActivity] 

を得る判明。私はいずれの活動についても特別なオプションを設定していません。しかたがない!

+0

悲しいことに、これは私にとってはうまくいかないようです。私のMainActivityは、実際には再びナビゲーションスタックにプッシュされ、1回の通知で1回しか動作しません(私はそれらを自動ディスマップしません)。何か案は? – bompf

+1

@bompf、これはおそらく 'PendingIntent.getActivities'で' PendingIntent.FLAG_ONE_SHOT'が使用されているためです。私は代わりに 'PendingIntent.FLAG_CANCEL_CURRENT'を提案します。 – Sam

+1

ありがとうございます。 'TaskStackBuilder'はうまくいかなかったのに対し、これは私のために働いていました。しかし、あなたのコードは奇妙な状態になりました。ランチャー経由で 'MainActivity'を開いて、通知からアクションを開いた場合、' MainActivity'に戻るために戻るボタンを押した後、戻るボタンを押すと、 'MainActivity'を再度実行します。このように: '[MainActivity] [MainActivity] [ConversationActivity]'。 2行目のコードを 'backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)'に変更して修正しました。 – Sam

1

私はこれを達成するための2つの方法を知っている:

    は、通知によって開始された活動の中から、あなたの home activityを起動し
  1. 。さまざまなエントリーポイントを区別して追跡する必要があるため、これはかなりトリックになることがあります。
  2. あなたはいつもhome activityで始まり、通知によって開始されているかどうかを確認してからnotification activityを開始します。これにより、一貫したエントリポイントが確保され、ユーザがUpキーを押したときにバックスタックがそこに配置されます。

よろしくお願いいたします。

0

ニース。

ただし、3歳未満は動作しません。0(APIレベル11より前)のシステムでは使用できないため、PendingIntent.getActivities()は使用できません。

これは、インテントから通知からアクティビティにアクセスし、戻るボタンをアプリケーションとコヒーレントに動作させるバックスタックを構築する場合と同じです(詳細アクティビティはリストアクティビティに戻ります)。

0

アクティビティは、バックスタック内のアクティビティのグループだけであるタスクに関連付けられます。通知をクリックすると新しいアクティビティが開くと、そのアクティビティが独立したアクティビティとして開かれ、新しいタスクが実行されます。これは、通知アクティビティと親アクティビティのみが存在することを意味します。

マニフェストファイルでアクティビティの起動モードを「標準」として指定するだけで問題を解決できます。

Intent resultIntent = new Intent(getApplicationContext(), 
         ResultActivity.class); 

PendingIntent resultPendingIntent = 
    PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT); 

mBuilder.setContentIntent(resultPendingIntent); 

NotificationManager mNotificationManager = (NotificationManager) 
    getSystemService(Context.NOTIFICATION_SERVICE); 
mNotificationManager.notify(notId, mBuilder.build()); 

マニフェスト:このソリューションは、まさにこの問題

android:noHistory="true" 
0

あり、これを行う方法についての新しいガイドがあり、それはよりも、いくつかのわずかに異なるプラクティスを提案上記の回答:

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

のrequestCodeには実際に0を使用しないでください。私にとっては0ではない数字が働いていたが、0はランチャーに戻るボタンをもたらした。

1

のために素晴らしい作品

<activity 
      android:name="com.mns.exercisenotifications.ResultActivity" 
      android:label="@string/app_name" 
      android:launchMode="standard" > <--- 
      <intent-filter> 
       <action android:name="com.mns.exercisenotifications.ResultActivity" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 

</activity> 
関連する問題