アプリがフォアグラウンドにあるときにアプリを強制終了する場合、これは Android がアプリを強制終了する場合と同じではありません (これは、アプリがバックグラウンドにある場合にのみ行われます)。アプリを強制終了してから再起動すると、最初からやり直すようなものです。ここでは「復元」は行われません。ロギングを追加すると、アプリを強制終了して再起動すると、渡されるが nullonCreate()
になることがわかります。Bundle
onCreate()
残念ながら、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 はすべての状態を記憶していますActivityB
ActivityA
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
メモリ内のみが変更されます。Intent
getIntent()
これがより明確になったことを願っています。そうでない場合は、お知らせください。