いつもIntent.Flag_*
の組み合わせを忘れてしまうのでメモ
やりたいこと
- Notificationからアプリを起動させる
- IntentでNotificationから起動されたことを示すデータを渡して「特殊な処理」をしたい
- Notificationからの起動時だけ処理したいので、「最近使ったアプリ一覧(Recent Apps)」経由で起動されたくない
- 通常Recent AppsにはIntentのデータも保持された状態で起動されるので、Recent Appsから起動されると「特殊な処理」が実施されてしまう
- Notificationからの起動時だけ処理したいので、「最近使ったアプリ一覧(Recent Apps)」経由で起動されたくない
- アプリがHOMEアイコンから(
action.MAIN
かつcategory.LAUNCHER
のタスクで)起動中だったり、Notificationから起動中だった場合に、Activityが重ならないようにしたい
フラグの組み合わせ
以下3つのフラグを設定すればOK
Intent.FLAG_ACTIVITY_CLEAR_TOP
スタック最上位と同じアクティビティを起動しようとした時は起動しない
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
新規タスク生成または既存タスクの最前面呼び出し時以外の時、タスクをリセットする。スタック内にFLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETで起動されたアクティビティが存在する時、そのフラグ仕様に応じてクリアされる。
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
通常はアクティビティを起動すると、「最近起動したアクティビティのリスト(ホームボタンの長押しを介してアクセス可能)」に表示されるが、このフラグで起動したアクティビティは表示されない。
サンプルコード
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(context, HogeActivity.class);
intent.putExtra("hoge", "fuga");
intent.setFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP // 起動中のアプリがあってもこちらを優先する
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED // 起動中のアプリがあってもこちらを優先する
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS // 「最近利用したアプリ」に表示させない
);
PendingIntent contentIntent =
PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.icon)
.setContentTitle("Nofitication Title")
.setContentText("Nofitication Message")
.setStyle(new NotificationCompat.BigTextStyle().bigText("Nofitication Message"));
mBuilder.setContentIntent(contentIntent);
notificationManager.notify(0, mBuilder.build());