10

私のアプリケーションでは、FLAG_ACTIVITY_SINGLE_TOPフラグとFLAG_ACTIVITY_CLEAR_TOPフラグを使用して開始されたアクティビティがありますこれ、そのアクティビティの1つのインスタンスのみがスタックの最上位にあり、古いインスタンスの最上位のすべてのアクティビティが閉じていることを確認するためです。ここまでは順調ですね。

次に、アクティビティが複数回作成され、連続して破棄された後、正しく復元されるかどうかをテストしたいと思いました。Activity.setIntent()whenを使用してインテントを手動で設定し、Activity.onNewIntent()最新のインテントがによって返されるように注意しActivity.getIntent()ます。開発者向けオプションで[アクティビティを保持しない]オプションを有効にしたことをテストするためにActivity.getIntent()、アクティビティが再作成されたときに返されるインテントは、アクティビティを作成した最初のインテントであり、最新のインテントではありません。

これはJBとICSで発生しますが、古いバージョンではテストしていません。私は何か間違ったことをしていますか、それともドキュメントで何かを誤解していましたか?

4

2 に答える 2

18

アプリがフォアグラウンドにあるときにアプリを強制終了する場合、これは Android がアプリを強制終了する場合と同じではありません (これは、アプリがバックグラウンドにある場合にのみ行われます)。アプリを強制終了してから再起動すると、最初からやり直すようなものです。ここでは「復元」は行われません。ロギングを追加すると、アプリを強制終了して再起動すると、渡されるが nullonCreate()になることがわかります。BundleonCreate()

残念ながら、Android がアプリを強制終了したときに何が起こるかをシミュレートするのは非常に困難です。

編集:OPのコメントの後にさらに追加しました

議論の目的のための具体的な例を次に示します。まず、開発者オプション「アクティビティを保持しない」なし:

  • ActivityAはルート アクティビティです
  • 始めますActivityA
  • ActivityA.onCreate()と呼ばれる
  • ActivityA今始まるActivityB
  • ActivityB.onCreate()が呼び出されます (アクティビティスタックにはActivityA->が含まれるようになりましたActivityB)
  • ActivityBで始まりActivityAFLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP余分な「foo」
  • ActivityA.onNewIntent()Intent包含FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOPと追加の「foo」で呼び出されます
  • ActivityB.onDestroy()アクティビティ スタックがクリアされてから呼び出されますActivityA

ここで、まったく同じことを行いますが、開発者オプション「アクティビティを保持しない」を有効にします (前のシナリオとは異なるものを太字で強調しています)。

  • ActivityAはルート アクティビティです
  • 始めますActivityA
  • ActivityA.onCreate()と呼ばれる
  • ActivityA今始まるActivityB
  • ActivityB.onCreate()が呼び出されます (アクティビティスタックにはActivityA->が含まれるようになりましたActivityB)
  • が停止したためActivityA、Android はそれを破棄して呼び出しますActivityA.onDestroy()
  • 注:現時点では のインスタンスはありませんが、アクティビティ スタックにはまだActivityA->が含まれています。Android はすべての状態を記憶していますActivityBActivityA
  • ActivityBで始まりActivityAFLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP余分な「foo」
  • Android にはActivityA再アクティブ化する のインスタンスがないため、インスタンスを作成する必要があります。
  • ActivityA.onCreate()Intentの元のインスタンスが作成されたときに呼び出されたのと同じ方法で呼び出されますActivityA(つまり、フラグもエクストラもない LAUNCH インテント)。
  • ActivityA.onNewIntent()Intent包含FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOPと追加の「foo」で呼び出されます
  • ActivityB.onDestroy()アクティビティ スタックがクリアされてから呼び出されますActivityA

ここで注意すべき重要なことは、Android はonCreate()アクティビティ インスタンスを作成するたびに常に呼び出すということです。のコンストラクタのように考えてくださいActivityActivityプロセスが強制終了された、またはアクティビティが破棄されたために Android が のインスタンスを再作成する必要がある場合、Android は新しいオブジェクトをインスタンス化し、 を呼び出しonCreate()、(必要に応じて) を呼び出しますonNewIntent()

これを呼び出しても、Android が保存および復元するsetIntent()は実際には変更されません。への呼び出しから返されるIntentメモリ内のみが変更されます。IntentgetIntent()

これがより明確になったことを願っています。そうでない場合は、お知らせください。

于 2013-02-13T12:38:49.427 に答える
3

これに対する解決策が見つかったかどうかはわかりませんが、ターゲット アクティビティの onNewIntent(Intent theNewIntent) メソッドをオーバーライドし、setIntent(theNewIntent) を呼び出すことで解決しました。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    /*
     * This overrides the original intent.
     */      
    setIntent(intent);
}
于 2013-08-19T06:09:19.337 に答える