[Android] Activity์ ์๋ช ์ฃผ๊ธฐ
#1 Android Application์ ์์ (AndroidManifext.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application ...>
<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>
...
</application>
</manifest>
์ฐ๋ฆฌ๊ฐ ์ฑ ์์ด์ฝ์ ๋๋ฅด๋ฉด, ์๋๋ก์ด๋ ์์คํ
์ ํด๋น ์ฑ์ Launcher Activity๋ฅผ ์คํ์ํจ๋ค. AndroidManifext.xml์ ๋ฑ๋ก๋ ์กํฐ๋นํฐ ์ค์์ <category android:name="android.intent.category.LAUNCHER" /> ํ๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์๋ Activity๊ฐ Launcher Activity๋ก ์ค์ ๋๋ค. ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ๋ Launcher Activity๊ฐ ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ ์๋ MainActivity๋ค.
์ด Launcher Activity๋ผ๋ ์ง์
์ ์ ํตํด ์ฑ์ด ์คํ๋๋ฉด, ๋น๋ก์ ์กํฐ๋นํฐ์ ์๋ช
์ฃผ๊ธฐ๊ฐ ์์๋๋ค.
#2 Activity LifeCycle
#2-1 ์๋ช ์ฃผ๊ธฐ ํ๋ฆ๋
'Activity launched'๊ฐ #1์์ ๋งํ ์ฑ์ ์ง์
์ ์ด๋ค. ์ง์
์ ์ดํ์๋ ์ฌ๋ฌ ์ํ(State)๊ฐ ์์ผ๋ฉฐ, Activity๋ฅผ ์ด State๋ค์ ์ด๋ฆฌ์ ๋ฆฌ ๋์๋ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ํ๋ง๋ค ์คํ๋๋ ํจ์๋ค์ ์ฝ๋ฐฑ(Callback) ํจ์๋ค. Android ์์คํ
์ ์ํด ์๋์ผ๋ก ํธ์ถ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ผ๋ก onCreate() ๋ฑ์ ํธ์ถํ์ง ์์ผ๋ฉฐ, ํด๋น ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ํด์ ์ค๊ณ๋ง ํด๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋๋ก์ด๋ ์์คํ
์ ์ฑ์ ์๋ช
์ฃผ๊ธฐ์ ๋ฐ๋ผ ํ์ํ ์์ ์ ๊ฐ๋ฐ์์ ์ํด ์ค๊ฒ๋ ํจ์๋ฅผ ํธ์ถํ๋ค.
#2-2 onCreate()
์๋ช
์ฃผ๊ธฐ์์ ๋ฐ๋์ ๋จ ํ๋ฒ๋ง ์คํ๋๋ ํจ์๋ค. ๊ทธ๋ฆฌ๊ณ Activity์ ๊ทผ๊ฐ์ ์ง๋ ํจ์์ด๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํจ์๋ค๊ณผ ๋ฌ๋ฆฌ ์ค๋ฒ๋ผ์ด๋๊ฐ ๊ฐ์ ๋๋ค. ์๋๋ก์ด๋ ์คํ๋์ค์์ ๋น ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด ์๋ MainActivity์ onCreate()๊ฐ ์ด๋ฏธ ๋ค์ด๊ฐ ์๋ ๊ฒ์ ๊ทธ๊ฒ์ด ๊ฐ์ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
#2-3 onStart()
์กํฐ๋นํฐ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๊ธฐ ์ง์ ์ ํธ์ถ๋๋ค. ์ด ์ํ(State)์์ Activity๋ ์ค๋งํธํฐ์ 'ํ๋ฉด(Foreground)'์ ๋์์ง ๊ฒ์ ๋๋นํด ์ค๋งํธํฐ ์ฌ์ฉ์์ ์ํธ์์ฉํ ์ค๋น๋ฅผ ํ๋ค. UI๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด ๋ฐ๋ก ์ด ๋จ๊ณ์ด๋ค.
#2-4 onResume()
Activity๊ฐ ์คํ ์ค์ธ ์ํ๋ค. ์ฆ, ์ฑ์ ํ๋ฉด์ด ์ฌ์ฉ์์ ๋์ ๋ณด์ด๊ธฐ ์์ํ๋ ์๊ฐ์ด๋ค. ์ด ์ํ๋ฅผ 'Activity running'์ด๋ผ๊ณ ํ๋ค. onResume()์ onStart() ํน์ onPause()์ ๋ค์ ์ํ๋ค. Activity๊ฐ ์คํ ์ค์ผ ๋ ํธ์ถ๋๋ ํจ์์ด๋ฏ๋ก, ๋ง์ ์ ๊ฒฝ์ ์จ์ฃผ์ด์ผ ํ๋ค. ์๋ฅผ ๋ค๋ฉด, onPause() ๋ค์์ผ๋ก ์คํ๋ ๋๋ฅผ ๋๋นํด ์๋ฒ์์ (์ฌ)์ฐ๊ฒฐํ๋ ์ฝ๋๋ฅผ ์จ ๋ฃ๋ ์์ด๋ค.
#2-5 onPause()
์ผ์์ค์ง ์ํ๋ค. ์ฌ์ฉ์๊ฐ ํ๋ฒํผ์ ๋๋ ๊ฑฐ๋, ํน์ ๊ฐ์๊ธฐ ์ ํ๊ฐ ์์ ์ ํ ํ๋ฉด์ผ๋ก ์ ํ๋๋ ๋ฑ 'ํ๋ฉด ๋ฐ(Background)'์ผ๋ก Activity๊ฐ ํ๊ฒจ์ ธ๋๊ฐ๋ฉด onPause()๊ฐ ์คํ๋๋ค. onPause() ์ํ์์ ์๋๋ก์ด๋ ์ฑ์ด Background์ ์์ ๋ ์คํ๋์ด์ ์ ๋๋ ๋์์ ๋ง์์ผ ํ๋ค. ์ฌ์ฉ์๊ฐ ์ด๋ค Activity๋ฅผ ํ๋ฉด ๋ฐ์ผ๋ก ์น์ฐ๊ณ ๋ค๋ฅธ ์ผ์ ํ๊ณ ์์์๋, ํด๋น Activity๊ฐ ์๋ฅผ ๋ค์ด, ์๋ฒ์ ํต์ ์ ํ๋ค๋ฉด ๋ง์ ์์์ด ๋ญ๋น๋ ๊ฒ์ด๋ค.
onPause()์ผ ๋, ๋ค์ Activity๋ฅผ 'ํ๋ฉด(Foreground)'๋ก ๋ถ๋ฌ๋ค์ด๋ฉด onResume()์ด ์คํ๋๋ค. ์ฌ์ฉ์๊ฐ ํํ๋ฉด์์ ๋ค์ ์ฑ์ ์คํ์ํค๊ฑฐ๋ ์ ํ๊ฐ ๋๋์ ์ค๋งํธํฐ ํ๋ฉด์ด ์๋ ํ๋ ์ฑ์ผ๋ก ์๋ ์ ํ๋ ๊ฒฝ์ฐ๋ค.
#2-6 onStop()
onPause() ์ํ์์ ์ฑ์ด ์ฅ๊ธฐ๊ฐ onResume()๋์ง ์์ผ๋ฉด ์๋๋ก์ด๋ ์์คํ
์ ํด๋น Activity๋ฅผ onStop() ์ํ๋ก ๋ณด๋ธ๋ค. ์ด ๊ฒฝ์ฐ, Activity์ ์ธ์คํด์ค๋ ์ฌ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ์ง๋ง UI ํ๋ฉด ๊ตฌ์ฑ์ ํ๊ดด๋๋ค.
#2-7 onRestart()
onStop() ์ํ์ผ๋ ์ฌ์ฉ์๊ฐ Activity๋ฅผ 'ํ๋ฉด ์(Foreground)'์ผ๋ก ๋์ด๋ค๋์ผ๋ฉด ์คํ๋๋ค. UI๋ ์ด๋ฏธ ์์ค๋ ์ํ์ด๋ฏ๋ก, onRestart()์ onStart()๋ฅผ ๊ฑฐ์ณ UI๋ฅผ ๋ค์ ๋ง๋ค๊ณ , onResume()์์ ๋ค์ ์ฌ์ฉ์์๊ฒ ํด๋น UI๋ฅผ ๋ณด์ฌ์ค๋ค.
#2-8 onDestroy()
'์ฑ ์ข
๋ฃํ๊ธฐ' ๋ฒํผ์ ๋ง๋๋ ๋ฑ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋์ ์ผ๋ก Activity๋ฅผ ํ๊ดดํ๋ ๋ช
์์ ์ฝ๋๋ฅผ ์งฐ๊ฑฐ๋, ํ๋ฉด ํ์ (ํด๋น ๋งํฌ์ #1-2 ์ฐธ์กฐ)์ด๋ ์ธ์ด ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ํ๊ฒฝ์ ๋ณํ(Configuration Change)๊ฐ ์๊ธฐ๋ฉด ํธ์ถ๋๋ ์ํ๋ค. ํ์์ ๊ฒฝ์ฐ์๋ ์๋๋ก์ด๋ ์์คํ
์ ๊ณง๋ฐ๋ก onCreate() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
#3 ์กํฐ๋นํฐ ์๋ช ์ฃผ๊ธฐ ์ดํด๋ณด๊ธฐ์ฉ ์ฑ
#3-1 MainActivity.kt
// package com.example.activitylifecyclelogger
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.i("interfacer_han", "MainActivity.onCreate()")
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val switchActivityButton = findViewById<Button>(R.id.switchActivityButton)
switchActivityButton.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
/* FLAG_ACTIVITY_REORDER_TO_FRONT ํ๋๊ทธ๋ ํธ์ถํ๋ ค๋ ์กํฐ๋นํฐ๊ฐ ์ด๋ฏธ ์คํ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ,
* ํด๋น ์กํฐ๋นํฐ๋ฅผ ์คํ์ ๋งจ ์๋ก ์ด๋์ํค๊ณ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํ๋๋ก ํจ.
* ์ด ํ๋๊ทธ๊ฐ ์์ผ๋ฉด, Activity๋ฅผ ์ ํํ ๋๋ง๋ค onCreate()๋จ.
*/
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
startActivity(intent)
}
}
override fun onStart() {
Log.i("interfacer_han", "MainActivity.onStart()")
super.onStart()
}
override fun onResume() {
Log.i("interfacer_han", "MainActivity.onResume()")
super.onResume()
}
override fun onPause() {
Log.i("interfacer_han", "MainActivity.onPause()")
super.onPause()
}
override fun onStop() {
Log.i("interfacer_han", "MainActivity.onStop()")
super.onStop()
}
override fun onRestart() {
Log.i("interfacer_han", "MainActivity.onRestart()")
super.onRestart()
}
override fun onDestroy() {
Log.i("interfacer_han", "MainActivity.onDestroy()")
super.onDestroy()
}
}
๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ๋ onCreate() ์ธ์ ๋ค๋ฅธ State์ ํด๋นํ๋ ๋ฉ์๋๋ค์ ์ ๋ถ ์ค๋ฒ๋ผ์ด๋ํ๊ณ Log๋ฅผ ํตํด ์ดํด๋ณธ๋ค.
#3-2 SecondActivity.kt
#3-1๊ณผ ๊ฑฐ์ ๊ฐ์ (์๋ต)
MainActivity์์ ์ ํ๋ ์กํฐ๋นํฐ๋ค. ํด๋น ์กํฐ๋นํฐ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก MainActivity๋ก ๊ฐ ์ ์๋ค.
#3-3 ๋ก๊ทธ ํ์ธ - ์กํฐ๋นํฐ ์ ํ
1. ์์ ํ๋ฉด (MainActivity)
MainActivity.onCreate()
MainActivity.onStart()
MainActivity.onResume()
2. SecondActivity๋ก ์ ํ
MainActivity.onPause()
SecondActivity.onCreate()
SecondActivity.onStart()
SecondActivity.onResume()
MainActivity.onStop()
3. ๋ค์ MainActivity๋ก ์ ํ
SecondActivity.onPause()
MainActivity.onRestart()
MainActivity.onStart()
MainActivity.onResume()
SecondActivity.onStop()
#3-4 ๋ก๊ทธ ํ์ธ - ์กํฐ๋นํฐ ํ์
1. ์์ ํ๋ฉด (MainActivity)
MainActivity.onCreate()
MainActivity.onStart()
MainActivity.onResume()
2. ์์ ํ๋ฉด์์ 90๋ ํ์
MainActivity.onPause()
MainActivity.onStop()
MainActivity.onDestroy()
MainActivity.onCreate()
MainActivity.onStart()
MainActivity.onResume()
3. (2)์์ 180๋ ํ์
๋ก๊ทธ ๋ฐ์๋์ง ์์. ๊ฐ๋ก์ ์ธ๋ก์ ๋๋น๊ฐ ๋ณํ์ง ์๋ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๊ฒฝ ๋ณํ๋ ์๋ค๊ณ ๋ณผ ์ ์์ผ๋ฉฐ, ๋ฐ๋ผ์ onDestroy()๋ ์คํ๋์ง ์๋๋ค.
#4 ์์ฝ
์กํฐ๋นํฐ ์๋ช
์ฃผ๊ธฐ๋ ์๋๋ก์ด๋ ์์คํ
์ ํ๋ฒ์ด๋ค.
#5 ์์ฑ๋ ์ฑ
https://github.com/Kanmanemone/android-practice/tree/master/lifecycle/ActivityLifecycleLogger