Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

いつも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メモ アクティビティの起動モードと起動フラグ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした