先上 Google 提供的経典的図は、Activity のライフサイクルの各段階間のナビゲーション変換の直感的な表示です。
Activity クラスは、6 つのコアコールバックを提供します:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()。
説明#
- 通常の場合、Activity は以下の順序でライフサイクル全体を経験します:onCreate ()->onStart ()->onResume ()->onPause ()->onStop ()->onDestory ()。
- onCreate (): システムが Activity を初めて作成するときにトリガーされ、初期化作業などを行うことができます。たとえば、Activity に必要なデータの初期化や、setContentView を呼び出してレイアウトリソースをロードすることができます。
- onRestart ():Activity が再起動していることを示します。一般的には、現在の Activity が不可視から可視状態に戻ると、onRestart が呼び出されます。この場合、通常はユーザーの操作によるものであり、ユーザーがホームキーを押してデスクトップに切り替えたり、別の新しい Activity を開いたりしてから、再びこの Activity に戻ることがあります。
- onStart (): Activity が開始されていることを示します。つまり、まもなく開始されます。この時点で Activity は表示されていますが、** まだ前面に表示されておらず、ユーザーとの対話はできません。** この時点では、Activity が表示されているが、まだ見えないと考えることができます。
- onResume (): Activity が表示され、前面に表示され、アクティブになりました。onStart () と比較する必要があります。onStart の場合、Activity はバックグラウンドにあり、onResume の場合、Activity は前面に表示されます。
- onPause (): Activity が停止しており、まだ見えています。通常、直後に onStop が呼び出されますが、onPause では時間のかかる操作を実行することはできません。これは新しい Activity の表示に影響を与えます。なぜなら、onPause が完了するまで、新しい Activity の onResume は実行されないからです。
- onStop (): Activity が停止しようとしており、見えなくなります。少し重い回収作業を行うことができますが、時間がかかりすぎてもいけません。
- onDestory (): Activity が破棄される予定であり、これは Activity ライフサイクルの最後のコールバックです。回収作業や最終的なリソースの回収などを行うことができます。
一般的なシナリオ#
A ページの Activity から B ページの Activity に移動し、次に B ページの Activity を閉じて A ページの Activity に戻る場合#
- 開かれた B ページの Activity に対して、最初の起動時のコールバックは次のようになります:onCreate ()->onStart ()->onResume ()
- ユーザーが B ページの Activity を開いた場合、A ページの Activity は見えない状態で次のコールバックが行われます:onPause ()->onStop ()
- B ページから A ページの元の Activity に戻る場合、A ページは見えない状態から見える状態になり、次のコールバックが行われます:onRestart ()->onStart ()->onResume ()
- バックキーを押すと、B ページの Activity のコールバックは次のようになります:onPause ()->onStop ()->onDestory ()
- ホームキーを押してデスクトップに切り替えた後、A ページの Activity に戻る場合、次のコールバックが行われます:onPause ()->onStop ()->onRestart ()->onStart ()->onResume ()
- finish () メソッドを呼び出した後、次のコールバックが行われます:onDestory ()(onCreate () メソッドで呼び出される場合を例に挙げていますが、異なるメソッドでは異なるコールバックが行われます。通常、onCreate () メソッドで呼び出されます)
Activity の 3 つの実行状態#
Resumed(アクティブ状態)#
ユーザーが操作している Activity で、画面上に表示されています。
Paused(一時停止状態)#
これはあまり一般的ではない状態です。この Activity は画面上に表示されていますが、最前面の Activity ではありません。たとえば、別の非全画面または透明の Activity が Resumed 状態であり、この Activity を完全に覆い隠していない場合です。
Stopped(停止状態)#
Activity が完全に表示されなくなった場合、この Activity はまだバックグラウンドで実行され、メモリには Activity の状態が保持されます。完全に破棄されたわけではありません。これも理解しやすいですが、別の画面に移動した場合、以前の画面に戻ると、通常は元の状態に戻ります。ほとんどのソフトウェアは、開いたときに直接ホームキーを押して閉じるわけではなく、この時点での Activity は Stopped 状態です。
一部のフローブランチ#
- Activity の起動:onCreate ()—>onStart ()—>onResume ()、Activity が実行状態に入ります。
- Activity がバックグラウンドに移動:現在の Activity が新しい Activity の画面に切り替わるか、ホームキーを押してホーム画面に戻る場合: onPause ()—>onStop ()、停止状態に入ります。
- Activity が前面に戻る:onRestart ()—>onStart ()—>onResume ()、再び実行状態に戻ります。
- Activity がバックグラウンドに移動し、システムのメモリが不足している場合、システムはバックグラウンド状態の Activity を終了します(この時点で Activity の参照はまだタスクスタックにありますが、参照が null を指すようになります)。この Activity に再度アクセスすると、onCreate ()–>onStart ()—>onResume () が実行されます(Activity の初期化ライフサイクルが再度実行されます)。
- ロック画面:onPause ()->onStop ()
- ロック解除:onStart ()->onResume ()
横画面と縦画面の切り替え#
最初の場合、現在の Activity を破棄する:#
横画面と縦画面の切り替えのプロセスでは、Activity は破棄されてから再作成されるため、この状況を避ける必要があります。
以下の 2 つのコールバックがあります:
- onSaveInstanceState と onRestoreInstanceState。
- Activity が異常終了した場合、システムは現在の Activity の状態を保存するために onSaveInstanceState を呼び出します。このメソッドの呼び出しは onStop の前に行われ、onPause とは特定のタイミングの関係はありません。このメソッドは、Activity が異常終了した場合にのみ呼び出されます。異常終了した Activity が再作成された後、システムは onRestoreInstanceState を呼び出し、Activity が破棄されたときに onSaveInstanceState メソッドで保存された Bundle オブジェクトパラメータを onRestoreInstanceState と onCreate メソッドに同時に渡します。したがって、Activity の状態を onRestoreInstanceState メソッドで復元することができます。このメソッドの呼び出し時期は onStart の後です。onCreate と onRestoreInstanceState メソッドの違い:onRestoreInstanceState コールバックは Bundle オブジェクトが null でないことを示しますので、null チェックは必要ありません。onCreate では null チェックが必要です。onRestoreInstanceState を使用することをお勧めします。
- 簡単に言えば、このプロセスでは Activity のライフサイクルは次のようになります:onPause ()->onSaveInstanceState ()-> onStop ()->onDestroy ()->onCreate ()->onStart ()->onRestoreInstanceState->onResume ()
2 番目の場合、現在の Activity は破棄されず、Activity のプロパティを設定する必要があります:#
AndroidManifest ファイルの Activity で次の属性を指定することで、横画面と縦画面の切り替え時に Activity が破棄されずに再作成されることを避けることができます。
<activity
android:name=".activity.VideoDetailActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"/>
次のメソッドをコールバックすることで、横画面と縦画面の切り替え時に Activity が破棄されずに再作成されることを避けることができます。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
リソースが不足した場合、Activity の優先順位の順序を保持する:#
- フォアグラウンドの Activity - ユーザーとの対話中の Activity で、最も優先度が高いです。
- 可視だがフォアグラウンドでない Activity - たとえば、Activity がダイアログを表示しており、Activity は可視ですが、ユーザーとの対話はできません。
- バックグラウンドの Activity - 停止された Activity で、onStop が実行されています。最も優先度が低いです。