ํ๊ตญ ๊ณต์ ๋ฌธ์์์๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ ์ฒ๋ฆฌ
๋ผ๋ ์ ๋ชฉ์ผ๋ก ์ฐพ์๋ณผ ์ ์๋๋ฐ ๊ทธ ๋ฌธ์์์๋ ์์คํ
์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด Activity
๋ฅผ ๋ค์ ๋ง๋ ๋ค๊ณ ๋์ ์๋๋ฐ ์ฝ๊ฒ ๋งํ๋ฉด ํ๋ฉด ๋ฐฉํฅ์ด ๋ณ๊ฒฝ์ด ๋๋ฉด ์ด๊ฒ ์ํ๊ฐ ๋ณ๊ฒฝ์ด ๋๋ ์ด๋ฒคํธ๋ Activity
๊ฐ ์๋ฉธํ๊ณ ๋ค์ ์์ฑ์ด ๋ฉ๋๋ค.
๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์์คํ
์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด Activity
๋ฅผ ๋ค์ ๋ง๋ ๋ค. ์ด๋ฅผ ์ํด ์์คํ
onDestroy()๋ฅผ ํธ์ถํ๊ณ ๊ธฐ์กด Activity ์ธ์คํด์ค๋ฅผ ์๋ฉธ์ํต๋๋ค. ๊ทธ๋ฐ ๋ค์ onCreate()๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๋ฉด ์ด ์ Activity ์ธ์คํด์ค๋ ์
๋ฐ์ดํธ๋ ์ ๊ตฌ์ฑ์ผ๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ๋ํ ์์คํ
์์๋ ์ ๊ตฌ์ฑ์ผ๋ก UI๋ฅผ ๋ค์ ๋ง๋ญ๋๋ค.
์ฝ๊ฒ ์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
onDestroy()
๋ฅผ ํธ์ถํ๋ฉฐ ์๋ฉธ ๋ฉ๋๋ค.onCreate()
๋ฅผ ํธ์ถํ๋ฉฐ ์๋ก์ด Activity ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค.์๋๋ ์๋๋ก์ด๋ ๊ณต์ ๋ฌธ์์์ ์ ๊ณตํ๋ ์๋๋ก์ด๋ ์๋ช
์ฃผ๊ธฐ ๊ทธ๋ฆผ์ธ๋ฐ ์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ์ดํด๋ฅผ ํ๋ฉด ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
์ฌ์ค ๊ณต์ ๋ฌธ์์์๋ Compose์ ๋ํด์๋ ๋์ ์์ง๋ง ์ ๋ ์์ง Compose์ ์ต์์ง ์์ XML๋ก ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ๊ฐ ๋ง๋ ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp">
<TextView
android:id="@+id/counterText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/TextViewConter"
android:textSize="18sp"
android:layout_marginTop="16dp" />
<Button
android:id="@+id/incrementButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ํด๋ฆญ"
android:layout_marginTop="16dp" />
</LinearLayout>
class MainActivity : AppCompatActivity() {
// Log ํ๊ทธ
private val TAG = "MainActivityLifecycle"
private lateinit var binding: ActivityMainBinding
private var counter = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
Log.d(TAG, "onCreate")
binding.incrementButton.setOnClickListener {
counter++
binding.counterText.text = "Counter: $counter"
}
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart")
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume")
}
override fun onPause() {
super.onPause()
Log.d(TAG, "onPause")
}
override fun onStop() {
super.onStop()
Log.d(TAG, "onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy")
}
override fun onRestart() {
super.onRestart()
Log.d(TAG, "onRestart")
}
}
๋ฒํผ์ ๋๋ฌ ์ซ์๋ฅผ ์ฆ๊ฐ ์ํจ ํ ํ๋ฉด ํ์ ๊ณผ ๋คํฌ๋ชจ๋๋ก ๋ณ๊ฒฝ์ ์งํํ ๊ฒฐ๊ณผ ์ฆ๊ฐ๋ ์ซ์๋ ๋ค์ 0์ผ๋ก ๋ณํ๋ ๊ฑธ ํ์ธ ํ์์ต๋๋ค.
Logcat๋ ํ์ธํด ๋ณด๋ฉด onPause onStop onDestroy ๊ฐ ์งํ์ด ๋๊ณ onCreate onStart onResume ์์ผ๋ก ๋ค์ ๋ทฐ๊ฐ ์์ฑ ๋๋ ๊ฒ์ ํ์ธํ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ Configuration change๊ฐ ์ผ์ด๋๋ฉด data๊ฐ ์์ด์ง๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ๊ทธ๋ผ data๋ฅผ ์ ์งํด์ผํ๋๋ฐ ์ ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ก์ปฌ DB(SharedPreference, DataStore, Room)
,viewModel
,SavedInstanceState (SavedStateHandle)
๋ฑ์ด ์์ต๋๋ค.
๋ค์ ๋ธ๋ก๊ทธ ํฌ์คํ
์ Configuration change๊ฐ ์ผ์ด๋๋ฉด data๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๋ ์๋ช ์ฃผ๊ธฐ ๊ณต์ ๋ฌธ์
๊ตฌ์ฑ ๋ณ๊ฒฝ ์ฒ๋ฆฌ ๊ณต์ ๋ฌธ์