<HOME

Activityのライフサイクル30分


Activityは、画面を提供するAPIです。


AndroidのActivityを実装するにあたって、ライフサイクルを意識することは非常に重要です。

詳細については公式サイトに記載されています。

  • Activityのライフサイクルの概要図は以下の通りです。

  • Android OSによりActivityが起動される際、まずActivityインスタンスがcreateされます。

    Android OSによるActivityのcreateが完了すると、そのActivityに対してonCreateがコールされます。

    各Activityは、生成時に行いたい処理をonCreateに記述します。

    なお、この時まだ画面は表示されていないので、表示後に決まるUIのサイズを取得したい、などの処理は意図通りに動作しません。

  • createされたActivityがAndroid OSにより実際に表示されようとする際、start処理が実行されます。

    Android OSによるActivityのstartが完了すると、そのActivityに対してonStartがコールされます。

    各Activityは、表示開始時に行いたい処理をonStartに記述します。

    なお、いざ画面を表示しようという状態のため、ここで処理を行いすぎるのは好ましくありません。

    onStartに処理を記述しないといけないケースは多くないため、処理を記述する際は本当に適切なタイミングか一考してみてください。

  • Activityが表示され、フロント動作できる状態になると、Android OSによりそのActivityに対してonResumeがコールされます。

    各Activityは、Resume状態になった際に行いたい処理をonResumeに記述します。

    画面が表示されたタイミングで行いたい処理を記述するケースが多いです。

    onPauseでメディア再生を一時停止し、onResumeで再開するなど。

    頻繁にコールされるので、リソースの読込など、本来一度実行しておけば済む処理を記述するのは好ましくありません。

  • Activityがバックグラウンドに移行すると、Android OSによりそのActivityに対してonPauseがコールされます。

    別のActivityが重なって全く見えなくなる場合や、アラーム等の割り込みで(見えてはいるが)バックグラウンドに回る場合が相当します。

    各Activityは、Pause状態になった際に行いたい処理をonPauseに記述します。

    画面が隠れたタイミングで行いたい処理を記述するケースが多いです。

    onPauseでメディア再生を一時停止し、onResumeで再開するなど。

    頻繁にコールされるので、リソースの読込など、本来一度実行しておけば済む処理を記述するのは好ましくありません。

  • Activityが完全にバックグラウンドに移行すると、Android OSによりそのActivityに対してonStopがコールされます。

    Activityが完全に見えなくなる場合、Pause状態→Stop状態へ移行します。

    各Activityは、Stop状態になった際に行いたい処理をonStopに記述します。

    Stop状態になると、いつシステムからKillされてもおかしくない状態になります。

    そのため、外部リソースの解放や、データ保存処理等をこのタイミングで行うケースがあります。

  • Activityが破棄されるタイミングで、Android OSによりそのActivityに対してonDestroyがコールされます。

    各Activityは、破棄される際に行いたい処理をonDestroyに記述します。

    ただし、GCでインスタンスが解放されるケースなど、この処理が動かないことがあります。

    動的に確保したメモリや強参照の解放をこのタイミングで行うケースが多いです。

    ただし上述の通りコールされないケースもあるので、onStopとどちらが適切か意識して実装する必要があります。

  • 実際にアプリを動作させて、どのような時に状態の移行が行われるのかを確認してみましょう。

    1. 前回作成したHelloWorldアプリの「MainActivity.java」を、以下の内容に変更してください。

      処理がコールされた際に画面上にメソッド名が表示されるようになります。

      MainActivity.java

      コードを表示するにはJavaScriptを有効にしてください

    2. アプリを実行してみてください。

      アプリが起動し、画面が表示されます。

      その際、「onCreate」→「onStart」→「onResume」と遷移するのがわかります。

    3. アプリ起動中にBackキーを押してみてください。

      アプリが終了します。

      その際、「onPause」→「onStop」→「onDestroy」と遷移するのがわかります。

    4. 再度アプリを起動してみてください。

      画面が表示されます。

      その際、「onCreate」→「onStart」→「onResume」と遷移するのがわかります。

      先ほどActivityが破棄されていたので、「再開」ではなく「生成」が行われ、onRestartではなくonCreateがコールされました。

    5. Homeキーを押してみてください。

      Home画面が表示されます。

      その際、「onPause」→「onStop」と遷移するのがわかります。

      「onDestroy」はコールされませんでした。

      Homeキー押下ではActivityは終了されず、Home画面が上に乗っているだけだということがわかりました。

    6. 再度アプリを起動してみてください。

      画面が表示されます。

      その際、「onRestart」→「onStart」→「onResume」と遷移するのがわかります。

      Activityが破棄されていないので、「生成」ではなく「再開」が行われ、onCreateではなくonRestartがコールされました。

    7. コマンドプロンプトから以下のコマンドを実行してみてください。

      adb shell am start -a android.intent.action.PICK_ACTIVITY

      「アクティビティの選択」画面が表示されます。

      その際、「onPause」へ遷移するのがわかります。

      Activityが完全に見えなくなっているわけではないので、「onStop」はコールされませんでした。

    8. Backキーで「アクティビティの選択」画面を閉じてください。

      HelloWorldアプリの画面が最前面に表示されます。

      その際、「onResume」へ遷移するのがわかります。

      Pause状態からの復帰であるため、「onCreate」や「onRestart」、「onStart」はコールされませんでした。