アプリがフォアグラウンドにあるときにアプリを強制終了する場合、これは Android がアプリを強制終了する場合と同じではありません (これは、アプリがバックグラウンドにある場合にのみ行われます)。アプリを強制終了してから再起動すると、最初からやり直すようなものです。ここでは「復元」は行われません。ロギングを追加すると、アプリを強制終了して再起動すると、渡されるが nullonCreate()になることがわかります。BundleonCreate()
残念ながら、Android がアプリを強制終了したときに何が起こるかをシミュレートするのは非常に困難です。
編集:OPのコメントの後にさらに追加しました
議論の目的のための具体的な例を次に示します。まず、開発者オプション「アクティビティを保持しない」なし:
ActivityAはルート アクティビティです
- 始めます
ActivityA
ActivityA.onCreate()と呼ばれる
ActivityA今始まるActivityB
ActivityB.onCreate()が呼び出されます (アクティビティスタックにはActivityA->が含まれるようになりましたActivityB)
ActivityBで始まりActivityA、FLAG_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で始まりActivityA、FLAG_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()アクティビティ インスタンスを作成するたびに常に呼び出すということです。のコンストラクタのように考えてくださいActivity。Activityプロセスが強制終了された、またはアクティビティが破棄されたために Android が のインスタンスを再作成する必要がある場合、Android は新しいオブジェクトをインスタンス化し、 を呼び出しonCreate()、(必要に応じて) を呼び出しますonNewIntent()。
これを呼び出しても、Android が保存および復元するsetIntent()は実際には変更されません。への呼び出しから返されるIntentメモリ内のみが変更されます。IntentgetIntent()
これがより明確になったことを願っています。そうでない場合は、お知らせください。