Android Activityのライフサイクル確認

はじめに

Android Activityのライフサイクルを確認する目的で、挙動確認用のコードをKotlinで書いてみました。

ライフサイクル

f:id:wanouri:20200201224755p:plain
アクティビティのライフサイクルの簡略図
アクティビティのライフサイクルについて  |  Android デベロッパー  |  Android Developers

挙動確認用のコード

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:maxLines="40"
        android:minLines="40"
        android:scrollbars="horizontal"
        android:singleLine="false"
        android:text="TextView"
        android:textSize="24sp"
        android:textStyle="bold"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

activity_main.xml

package com.example.activitysample

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        addText("onCreate")
    }

    override fun onStart() {
        super.onStart()
        addText("onStart")
    }

    override fun onRestart() {
        super.onRestart()

        addText("onRestart")
    }

    override fun onResume() {
        super.onResume()
        addText("onResume")
    }

    override fun onPause() {
        super.onPause()
        addText("onPause")
    }

    override fun onStop() {
        super.onStop()
        addText("onStop")
    }

    override fun onDestroy() {
        super.onDestroy()
        val dt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
        Log.d(MainActivity::class.java.simpleName,dt.plus(" ").plus("onDestroy"))
    }

    fun addText(s : String) {

        val dt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))

        val textView : TextView = findViewById(R.id.textView)

        if (textView.text.isNotEmpty()) {
            textView.text = textView.text.toString().plus("\n").plus(dt).plus(" ").plus(s)
        }
        else
        {
            textView.text = dt.plus(" ").plus(s)
        }
    }

}

MainActivity.kt

挙動は、TextViewに時刻と一緒に追記する形で実装しました。OnDestroy()メソッドは、TextView表示ではなくLog出力させています。

デバッガで実行してみる

f:id:wanouri:20200202161351p:plain
デバッガで実行

f:id:wanouri:20200202161821p:plain
別のアプリを起動後戻ってくるとき
メニューボタンを押して別のアプリを操作後、このアプリに戻ってくるときは

  • メニューボタンを押して、別のアプリ起動
  1. onPause
  2. onStop
  • 別のアプリから戻ってくる
  1. onRestart
  2. onStart
  3. onResume

バックボタンを押すと

  1. onPause
  2. onStop
  3. onDestroy

画面を回転させると、onCreateから実行されます。

それぞれなにを実装する?

onCreate
画面レイアウトの生成やクラスの生成など、アプリ起動後はじめに行う処理を実装します。

onStart
画面コントロールの初期化、クラスの初期化を実装します。

onResume
データベースへの接続やネットワーク接続を行い、
アプリ画面にデータを表示させる処理を実装します。

onPause
画面がバックグラウンドに回るときに呼び出されます。
この場合、アプリは強制終了させられてしまう可能性がありますので、データ保存処理などはここで行います。
データベース、ネットワークなどのdisconnectもここで行います。

onStop
onStartで初期化したクラスのDestroyメソッドをコールする処理を実装します。(クラスの中身をnull)

onDestroy
onCreateで生成したコントロールやクラスの参照変数の破棄を実装します。

github.com