LoginSignup
34
37

More than 5 years have passed since last update.

【Android】NotificationからIntentでデータを渡してアプリ起動するときのIntent.setFlagsメモ

Last updated at Posted at 2016-08-23

いつもIntent.Flag_*の組み合わせを忘れてしまうのでメモ

やりたいこと

  • Notificationからアプリを起動させる
  • IntentでNotificationから起動されたことを示すデータを渡して「特殊な処理」をしたい
    • Notificationからの起動時だけ処理したいので、「最近使ったアプリ一覧(Recent Apps)」経由で起動されたくない
      • 通常Recent AppsにはIntentのデータも保持された状態で起動されるので、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());

参考

Androidメモ アクティビティの起動モードと起動フラグ

34
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
37