私のアプリケーションには、ルート アクティビティとして機能する launchMode="singleTop" として定義されたアクティビティがあります。
<activity
android:name="com.package.LauncherActivity"
android:launchMode="singleTop"
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
アプリケーションは、クリックすると、フラグ Intent.FLAG_ACTIVITY_CLEAR_TOP を持つインテントを含む PendingIntent を使用して、このルート アクティビティを「再開」する通知を作成します。
Intent newIntent = new Intent(context, LauncherActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pi = PendingIntent.getActivity(
context,
(int)System.currentTimeMillis(),
newIntent,
PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT);
アイデアは、ユーザーが現在アプリ内にいる場所に関係なく、通知をクリックすると、アクティビティ スタックがクリアされ、このルート アクティビティで「最初から」開始されるというものです。
これはすべて適切に機能し、期待どおりに機能します。私は常に 1 つのタスクしか持っておらず、通知の PendingIntent が実行されると、スタックが正しくクリアされます。
私の問題は、これらの通知のいずれかが「再起動」した後に発生します。その後、アクティビティがバックグラウンドに配置され、さまざまなランチャーのいずれかを使用して再起動された場合 (最近のアプリ、設定 -> アプリ (正確ではなく、以下の更新を参照) など)、通知で使用されるインテントが使用されます。Intent.FLAG_ACTIVITY_CLEAR_TOP を含むアクティビティを開始します。
更新:実際、私の問題は、「最近のアプリ」ランチャーを使用してアプリを前面に表示しようとする場合にのみ適用されます。[設定] -> [アプリ ランチャー] を使用すると、アプリが最初から完全に起動されます。それでも、デフォルトの起動インテントを上書きする前のように、アプリを「再開」していません。また、longpress-Home レジュームを使用すると、アプリは期待どおりに再開することに注意してください。 その意図を再利用し続ける「最近のアプリ」ランチャーの違いは何ですか?
したがって、この時点で、ランチャーを介してアプリを再開するたびに、通知のインテントが使用される前のように単にアプリを再開するのではなく、「トップをクリア」して最初からやり直します。これは、それがアクティビティの同じインスタンスであり、そのアクティビティが起動されたインテントを使用して起動し続けるために発生します。この場合、それは毎回 FLAG_ACTIVITY_CLEAR_TOP フラグがあることを意味します。
この投稿は頭に釘を打ちましたが、私の問題は解決されていません。この投稿では、この再利用されたインテントのバンドル内のエクストラを適切に無視 (または使用) する方法について説明します。しかし、CLEAR_TOP フラグを使用して起動を停止するように、そのインテントのフラグをクリアする方法がわかりません。
通知が押されたときに、CLEAR_TOP フラグを使用して 1 回だけ起動するようにします。その後のアプリの起動では、通知が押される前と同じように実行する必要があります。これは、ユーザーがどこにいても(毎回ゼロから開始するのではなく)アプリ/アクティビティスタックを再開するだけでした。
アクティビティがインテントを再利用している理由を理解しました。PendingIntent が FLAG_ACTIVITY_CLEAR_TOP フラグでアクティビティを再開する前と同じように動作するように、それを停止するか、何らかの方法でそのインテントから CLEAR_TOP フラグをクリアする方法を見つける必要があります。
助けてくれてありがとう。