0

Androidマニフェストとして宣言されているAがありますActivity ランチャーから開始し、別のアクティビティBを起動して、ホームボタンを押します。これで、アクティビティスタック「AB」がバックグラウンドで待機しているタスクがあります。その後、ランチャーからアクティビティAを再度開始すると、スタックが復元された状態ですでに実行中のインスタンスに戻ります(アクティビティBはフォアグラウンドで実行されています)。singleTopandroid.intent.action.MAINIntent

これはいいね。そして、自分自身からアクティビティAを起動するときにも同じ効果を達成したいと思いNotificationます。Intentフラグのさまざまな組み合わせを試しましたが、アクティビティAの新しいインスタンスか、同じインスタンスでスタックがクリアされています(フォアグラウンドにアクティビティBがありません)。

4

1 に答える 1

0

まず、アクティビティ B のタスクを長期間使用していないときに、システムがアクティビティ B を強制終了しないようにします。

ユーザーが長時間タスクを離れた場合、システムはルート アクティビティを除くすべてのアクティビティのタスクをクリアします。ユーザーが再びタスクに戻ると、ルート アクティビティのみが復元されます。システムがこのように動作するのは、長い時間が経過した後、ユーザーが前に行っていたことを放棄し、新しいことを始めるためにタスクに戻る可能性が高いためです。

この動作を変更するために使用できるアクティビティ属性がいくつかあります。

alwaysRetainTaskState: タスクのルート アクティビティでこの属性が「true」に設定されている場合、前述のデフォルトの動作は発生しません。タスクは、長期間経過した後でもすべてのアクティビティをスタックに保持します。<activity>したがって、A のマニフェスト ファイルのタグの下で、これを true に設定する必要があります。

第二に、必要はありませんsingleTop。Android docs からこの図を確認してください。これはあなたが望むものだと思います。起動モードを指定するアクティビティを開始するsingleTask場合、そのアクティビティのインスタンスがバックグラウンド タスクに存在する場合、そのタスク全体がフォアグラウンドに移動します。この時点で、バック スタックには、スタックの一番上にある、前に持ち出されたタスクからのすべてのアクティビティが含まれます。

singleTaskしたがって、の代わりに、A と B のタグの下にも追加する必要がありますsingleTop。次に、通知からアクティビティ A をフラグなしで起動する必要がありますがFLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_REORDER_TO_FRONT(オプション)。

私はこれを自分で試したことはありませんが、うまくいくと強く信じています. 試してみて、そうでない場合はお知らせください。

于 2012-07-14T17:34:42.990 に答える