Magren

Magren

Idealist & Garbage maker 🛸
twitter
jike

Androidアクティビティのライフサイクル

先上 Google 提供的経典的図は、Activity のライフサイクルの各段階間のナビゲーション変換の直感的な表示です。
Activity クラスは、6 つのコアコールバックを提供します:onCreate()onStart()onResume()onPause()onStop()onDestroy()

生命周期.png

説明#

  • 通常の場合、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 が実行されています。最も優先度が低いです。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。