6

私のアプリには以下のようなアクティビティスタックがあります

  • 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>
4

2 に答える 2

9

通知によってアプリが起動されたので、それは履歴の一部になりました。おそらく、実際にタップされたときにのみ処理する必要があります。以下を確認します。

(getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0

true の場合、アクティビティは通知の意図ではなく、履歴から開かれています。

于 2013-02-27T21:56:17.333 に答える
1

を使用しているため、独自のアクティビティ バック スタックを使用して 2 つの個別のタスクを処理するとしますIntent.FLAG_ACTIVITY_NEW_TASKAランチャーから開始すると最初のタスクが作成されB、通知から開始すると 2 番目のタスクが作成されます。もしそうなら、2つの別々のタスクが本当に必要なものであることを確認する必要があります.

于 2012-04-04T09:52:00.453 に答える