📚Androidライフサイクル


📌ライフサイクルとは?


Activacyでは、作成、停止、再生、終了などの複数の状態を切り替えるための6つのコールバックが用意されています.アクティビティが新しい状態に入ると、各コールバックが呼び出されます.
💡 コールバックとは?Aはある特定の動作をして、AはBに教えます

https://developer.android.com/guide/components/activities/activity-lifecycle?hl=koソース

📌onCreate()


Activityを最初に作成するときに実行するメソッドで、アクティビティを作成するときに1回だけ呼び出されます.
ex)データバインド、ビューバインド、旧状態データ復旧等
このメソッドの実行が完了すると、onStart()が呼び出されます.

📌onRestart


ActiviiryはonStopの後に再起動したときに実行され、機能自体がonStartがあなたのためにしたことです.

📌onStart()


画面は見えますが、ユーザーとのやりとりはできません
onCreate()との違いは、onCreate()はActivityの実行時に一度だけ処理され、onStart()はonStopの実行後に行う操作に重点を置きます.

📌onResume()


アプリケーションに戻ると無条件に呼び出されます.たとえば、アプリケーションの使用中に電話が一時的に離れたり、アプリケーションでカメラを使ってカメラを開けたりした場合、Activityは一時的に停止して戻ってきます.
Activityが再起動されたときのアクションをonResume()で実行します.

📌onPause()


Activityでイベントが発生し、画面の一部が隠されるとコールバックが呼び出され、Activityは一時停止状態になります.
onPause()メソッドは短時間で動作するため、煩雑な作業はできません.たとえば、データを格納したり、ネットワークを呼び出したりする操作です.

📌onStop()


onPause()メソッドとは異なり、画面が部分的に隠されるとonPause()が呼び出され、画面が完全に隠されるとonStop()が呼び出されます.また、onPause()では煩雑なタスクを実行することができず、onStop()ではCPU消費の大きいタスクを実行することができる.

📌onDestory()


アクティビティは、アクティビティが消える前に実行され、onDestiny()でライフサイクルが終了します.

📌ライフサイクルログの撮影


まず、MainActiviyに記録します.dを撮ってくれました
package com.example.lifecycle

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

class MainActivity : AppCompatActivity() {
    //최초로 Activiry가 생성 될 때 실행되는 메서드 단 한번만 호출 된다.
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("life_cycle", "onCreate")
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("life_cycle", "onRestart")
    }

    //Ctrl + o 로 매서드를 만들 수 있다.
    // onCreate() 이후에 실행 된다 Activity가 실행되며 사용자가 앱과 상호 작용을 준비 한다.
    override fun onStart() {
        super.onStart()
        Log.d("life_cycle", "onStart")
    }

    //    다시 앱으로 돌아올 떄 호출 된다.
    override fun onResume() {
        super.onResume()
        Log.d("life_cycle", "onResume")
    }

    //    화면의 일부가 가려 졌을 때
    override fun onPause() {
        super.onPause()
        Log.d("life_cycle", "onPause")
    }

    //    화면 전부가 보이지 않을 때때
    override fun onStop() {
        super.onStop()
        Log.d("life_cycle", "onStop")
    }

    //    완전히 소멸 되기전에 실행
    override fun onDestroy() {
        super.onDestroy()
        Log.d("life_cycle", "onDestroy")
    }
}

📌 1.初めてAppを実行した場合


コードの作成、アプリケーションの構築、実行を開始すると、LogcatにはonCreate→onStart→onResumeと表示されます.

公式ファイルのシーケンス図によると、現在はonCreate→onStart→onResume経由でActivity runningに入ります.

📌 2.ホームボタンを押してアプリケーションを閉じる場合


アプリケーションが完全に消えたので、onPause→onStopが撮れました.

手順図によるとActivity Running状態でonPause→onStop順で

📌 3.Appに戻ったときログ


元のシーケンス図にはonRestart→onStart→onResumeが表示されます.ログにも同様にonRestart→onStart→onResumeが表示されます.
💡 onRestart()は、あまり使われないライフサイクルと呼ばれます.

📌 4.「マルチタスク処理」ボタンをクリックすると、アプリケーションのステータスを完全に閉じるのではなく、ログが表示されます。


理論的には部分的に隠れているのでonPauseまで撮りますがonStopまで撮りました
これは、androidマルチタスクプロパティが、複数のアプリケーションがバックグラウンドで同時に実行されることを意味するため、onStopが表示されます.
Multitasking the Android Way

📌 5.onPauseの例


onPauseを撮影するために、ホンドロイドというユビンが実習ビデオを通じて実習を行った.
onPause実習
Androidアプリケーション#45ライフサイクルの作成-アプリケーションを簡単に作成する方法(現開発者紹介)、android studio easy tutorial
package com.example.lifecycle

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.lifecycle.databinding.ActivityMainBinding
import com.example.lifecycle.databinding.ActivitySecondBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    //최초로 Activiry가 생성 될 때 실행되는 메서드 단 한번만 호출 된다.
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
setContentView(view)
        Log.d("life_cycle", "onCreate")

        //btnMove를 클릭을 할때 동작
        binding.btnMove.setOnClickListener{
//            MainActivity -> subActivity 이동
            startActivity(Intent(this@MainActivity, SecondActivity::class.java))
}

}

    override fun onRestart() {
        super.onRestart()
        Log.d("life_cycle", "onRestart")
    }

    //Ctrl + o 로 매서드를 만들 수 있다.
    // onCreate() 이후에 실행 된다 Activity가 실행되며 사용자가 앱과 상호 작용을 준비 한다.
    override fun onStart() {
        super.onStart()
        Log.d("life_cycle", "onStart")
    }

    //    다시 앱으로 돌아올 떄 호출 된다.
    override fun onResume() {
        super.onResume()
        Log.d("life_cycle", "onResume")
    }

    //    화면의 일부가 가려 졌을 때
    override fun onPause() {
        super.onPause()
        Log.d("life_cycle", "onPause")
    }

    //    화면 전부가 보이지 않을 때때
    override fun onStop() {
        super.onStop()
        Log.d("life_cycle", "onStop")
    }

    //    완전히 소멸 되기전에 실행
    override fun onDestroy() {
        super.onDestroy()
        Log.d("life_cycle", "onDestroy")
    }
}
package com.example.lifecycle

import android.app.Activity

import android.os.Bundle

class SecondActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
    }
}
android {
        ...
        viewBinding {
            enabled = true
        }
    }
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_move"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Main 버튼"/>

</androidx.constraintlayout.widget.ConstraintLayout>
<アクティブsecondコード>
<?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=".SecondActivity">

    <Button
        android:text="Sub 버튼"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
        <activity
            android:name=".MainActivity"
            android:exported="true"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity"   // SecondActivity activity 추가해주기
            android:theme="@android:style/Theme.Translucent"/>  // 투명 테마 
    </application>

</manifest>
準備ができました.では、次のように構築します.
このステータスは、プライマリ・アクティビティからSecondActivityに移動し、プライマリ・アクティビティと重複します.
だからonStopには行けない
画面が100%遮られたり、完全に停止したりすると、onStopが条件になります.