LoginSignup
4
2

More than 3 years have passed since last update.

【Kotlin】初心者向け: Activityのライフサイクルとその可視化

Posted at

はじめに 

 この記事は、Kotlin初心者の私が初心者なりに収集した情報を、同じく初心者の方々と共有する目的で作成しました。既存の記事はJava経験者向けの情報がとても多いと感じたので、真っ新の状態からでも理解できるよう、噛み砕いて説明していきます。

そもそもActivityとは?

 Activityとは、アプリの画面とその画面に備わる機能の事です。通常、アプリには複数のActivityが設定されています。メールアプリを例に取ると、メール一覧を表示する画面・メールの内容を表示する画面・メールを作成する画面等々、全て別のアクティビティで構成されています。基本的には、アプリを作るという事はActivityを構築する事と同義です。Activityを行ったり来たりさせることで、アプリに機能の幅を持たせることが出来ます。

Activityライフサイクルとは?

 activity_lifecycle.png
 ここでは、Activityのライフサイクルについて説明します。このライフサイクルを理解すると、Activityが破棄されてもデータを保持させ続けたりすることが出来ます。上図は、Activityの一生を表したものです。Activityが始まると、基本的には上から下に(onCreate()からonDestroy()へ)Activityの状態は変化していきます。Activityは起動や終了されるたびに、このサイクルを繰り返しているのです。具体的には、アプリを起動した後にホームボタンからホームに戻るときや画面の向きを変えた時(画面の向きを変えた時はActivityを再構築しています)など。しかし、毎回Activityを完全に破棄してしまうと、短時間での再開や再開時のデータ保持が困難になります。その為に、onStop()やonPause()からonRestart()やonResume()へ遷移できるようになっています。要はそれぞれのアプリは、動かす中で何度もこのサイクルを行っているという事だけ押さえてください。なぜアプリがこのようなライフサイクルを持っているかというと、処理や描画、データの保護などアプリを構築する上で必要な工程を分割して行いたいからです。onCreateではコードやビューの読み取り、onStartでは画面の描写…etcという風に各過程で作業が分担されています。(各過程の詳細は公式リファレンスで→https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja)

遷移の様子を見よう

package com.e.activitylifecycledemo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

private const val TAG = "MainActivity"
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        Log.d(TAG, "onStart: called")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        Log.d(TAG, "onStart: called")
        super.onStart()
    }

    override fun onResume() {
        Log.d(TAG, "onResume: called")
        super.onResume()
    }

    override fun onPause() {
        Log.d(TAG, "onPause: called")
        super.onPause()
    }

    override fun onStop() {
        Log.d(TAG, "onStop: called")
        super.onStop()
    }

    override fun onRestart() {
        Log.d(TAG, "onRestart: called")
        super.onRestart()
    }

    override fun onDestroy() {
        Log.d(TAG, "onDestroy: called")
        super.onDestroy()
    }
}

 では実際どのようにActivityのライフサイクルは行われているのでしょうか?MainActivity.ktをこのように記述して、電源をスリープさせたときや画面の向きを変えたときのActivityの様子を観察します。これらのコードは、onCreateメソッドの外で上のタブから Code>override methods を選択して、引っ張ってきただけです。Activityの各過程(on~~)が呼び出されるたびに、ログ(画面下部のlogcat)にその様子が出力されるようになっています。
キャプチャ.PNG
上手くいくと、このようにActivityの遷移の様子を可視化することが出来ます。電源ボタンを押したり、ホームボタンを押したり、各過程で微妙にActivityの遷移の過程が異なるので、実験することをお勧めします。(onStopとonPauseの違いなど)今回はログに結果を表示させただけですが、この方法を応用して電源を落としてもデータを保持させたりといった応用が利きます。近いうちにその記事も投稿する予定です。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2