私のアプリには以下のようなアクティビティスタックがあります
- A: ローディング アクティビティ
- B:主な活動
- C: 詳細アクティビティ
そしてマニフェストはこのようなものです
<activity A>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity B android:launchMode="singleTask"/>
<activity C/>
ランチャーからアプリを起動すると、 A -> B -> C として機能します。アクティビティ C でホーム ボタンを押し、最近のアプリ リストから呼び出す (ホームを長押し) と、C が表示されます。これで結構です。
しかし、通知からアプリを起動すると、読み込み画面を表示したくないため、アクティビティ B が開始されます。そのため、ユーザーは B -> C に移動できます。
ただし、ユーザーがアクティビティ C でホームを押し、最近のアプリ リストからアプリを選択すると、B が再起動され、状態は保持されません。したがって、C アクティビティは常に消えます。
多くのフラグ オプションを試しましたが、解決策が見つかりませんでした。私が欲しいのは、ユーザーがランチャーからアプリを起動したときと同じようにアプリが動作することです。
このような通知の保留中の意図を作成しました。私のアプリではIntent.FLAG_ACTIVITY_CLEAR_TOP
、アクティビティ Bに使用する必要があります。
Notification notice = new Notification(R.drawable.icon_notification, context.getString(R.string.app_name), System.currentTimeMillis());
Intent intent = new Intent(context, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtras(i);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
最近のアプリリストは同じインテントを通知で送信していると思うので、常にアクティビティ B が呼び出されます。しかし、ランチャーからアプリを起動すると、B ではなく最後のアクティビティ C に送られます。
助けてください。:(
アップデート
以下のようにこの問題を解決しました。
- タスク アフィニティが異なる新しいアクティビティ D を追加します。このアクティビティは、B (メイン アクティビティ) を開始するだけです。
- 通知で活動開始 D
- アクティビティ D で、いくつかのフラグを付けてアクティビティ B を開始し、それ自体を終了します。
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0 ) {
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_NEW_TASK);
} else {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
そして、以下のようにアクティビティDを登録しました
<activity
android:name="D"
android:clearTaskOnLaunch="true"
android:excludeFromRecents="true"
android:exported="false"
android:launchMode="singleInstance"
android:noHistory="true"
android:taskAffinity="xxx"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>