๐ SeSAC์ 'JetPack๊ณผ Kotlin์ ํ์ฉํ Android App ๊ฐ๋ฐ' ๊ฐ์ข๋ฅผ ์ ๋ฆฌํ ๊ธ ์ ๋๋ค.
์์คํ ์์ ์กํฐ๋นํฐ์ ๋ผ์ดํ์ฌ์ดํด์ ํฌ๊ฒ 3๊ฐ์ง๋ก ๊ตฌ๋ถํ๋ค.
- ํ์ฑ ์ํ : ์กํฐ๋นํฐ์ ํ๋ฉด์ด ์ถ๋ ฅ๋๊ณ ์๊ณ ์ ์ ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ํฌ ์ ์๋ ์ํ
- ์ผ์์ ์ง ์ํ : ์กํฐ๋นํฐ์ ํ๋ฉด์ด ์ถ๋ ฅ๋๊ณ ์์ง๋ง ์ ์ ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ํฌ ์ ์๋ ์ํ
- ๋นํ์ฑ ์ํ : ์กํฐ๋นํฐ์ ํ๋ฉด์ด ์ถ๋ ฅ๋๊ณ ์์ง ์๋ ์ํ
๊ฐ๋จํ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ฑ ์ํ๋ ํ๋ฉด์ด ๋ณด์ด๊ณ ์๊ณ ํฐ์น ๊ฐ๋ฅ
์ผ์์ ์ง ์ํ๋ ํ๋ฉด์ ๋ณด์ด์ง๋ง ํฐ์น ๋ถ๊ฐ๋ฅ (paused)
๋นํ์ฑ ์ํ๋ ์กํฐ๋นํฐ๊ฐ ์ข ๋ฃ๋์ง๋ ์์์ง๋ง ํ๋ฉด์ด ์ ํ ๋ณด์ด์ง ์๋ ์ํ (stop)
์ธํ
ํธ๋ก ์ฑ์ด ์คํ๋๋ฉด ์์คํ
์ ์กํฐ๋นํฐ๋ฅผ ์ฐ์ ํ์ฑ ์ฑํ
๋ก ๋ง๋ ๋ค.
๋ฐ์ฒ์ ์ธํ ํธ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ํ์ฑ ์ํ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ํจ์๊ฐ ์๋ ์ฝ ๋๋ค.
onCreate()
, onStart()
, onResume()
ํจ์๊ฐ ์๋ ์ฝ ๋๋ฉด์ ํ์ฑ ์ํ
๊ฐ ๋๋ค.
๋ฌผ๋ก ๊ฐ๋ฐ์๊ฐ ์ 3๊ฐ์ ํจ์๋ฅผ ๋ชจ๋ ์ค๋ฒ๋ผ์ด๋ํ ํ์๋ ์๋ค. ํ์ํ ๊ฒ๋ง ์ค๋ฒ๋ผ์ด๋ํ๋ฉด ๋๋ค.
๊ทธ๋์ ์ฃผ๋ก onCreate()
์์ setContentView
ํจ์๋ฅผ ํธ์ถํ๋ค. onCreate()
๋ ์ต์ด ํ ๋ฒ๋ง ํธ์ถ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์กํฐ๋นํฐ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๋ ๊ฒ์ ์ต์ด ํ ๋ฒ๋ง ํ๋ฉด ๋๋ค. ๊ทธ ํ์๋ ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝํด ๋๊ฐ๋ฉด ๋๋ค.
๋ฌผ๋ก onStart()
์ onResume()
์์ setContentView
๋ฅผ ํธ์ถํด๋ ๋๋ค. ํ์ง๋ง ์ด ๋์ ๋ฐ๋ณต ํธ์ถ ๊ฐ๋ฅ์ฑ์ด ์์ด ๋ถ์ ํฉํ๋ค.
ํ์ฑ ์ํ์์ onPause()
๋ผ๋ ํจ์๊น์ง ํธ์ถ๋ ์ํ๊ฐ ์ผ์์ ์ง ์ํ์ด๋ค. ํ๋ฉด์ ์ถ๋ ฅ๋์ง๋ง ์ ์ ์ด๋ฒคํธ๋ ๋ฐ์ง ์๋๋ค.
๊ทธ๋ฌ๋ค ๋ค์ ํ์ฑ ์ํ๋ก ๋์๊ฐ๊ธฐ ์ํด onResume()
์ ํธ์ถํ๋ค. ๋ฐ๋ผ์ onResume()
์ ๋ฐ๋ณต ํธ์ถ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๋ํ์ ์ธ ์ฌ๋ก๋ก, ๊ฐค๋ฌ๋ฆฌ์ ์นด์นด์คํก์ ๋ถํ ํ๋ฉด์ผ๋ก ๋์์ ๋์ด ๊ฒฝ๋ฅผ ๋ณผ ์ ์๋ค.
๊ฐค๋ฌ๋ฆฌ๋ฅผ ์คํ ์ํค๋ฉด 'ํ์ฑ ์ํ', onResume()
๊น์ง ํธ์ถ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์นด์นด์คํก์ ๋ถํ ๋ก ๋์ฐ๋ ์๊ฐ ํฌ์ปค์ค๊ฐ ๊ฐค๋ฌ๋ฆฌ์์ ์นด์นด์คํก์ผ๋ก ๋์ด๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐค๋ฌ๋ฆฌ๋ '์ผ์์ ์ง ์ํ',onPause()
๊ฐ ํธ์ถ๋๊ณ ์นด์นด์คํก์ onResume()
๊น์ง ํธ์ถ๋๋ค. ํฌ์ปค์ค๋ฅผ ๋ค์ ๊ฐค๋ฌ๋ฆฌ์ ์ฐ์ผ๋ฉด ํ์ฑ ์ํ๋ก ๋์๊ฐ๋ค.
ํ์ฑ ์ํ์ ์กํฐ๋นํฐ๊ฐ ๋นํ์ฑํ ์ํ๊ฐ ๋๋ฉด onPause()
๋ฅผ ๊ฑฐ์ณ onStop()
๊น์ง ํธ์ถ๋ ์ํ์ด๋ค. ๋นํ์ฑํ ์ํ๋ผ๊ณ ๋งํ์ง๋ง, ์์ง ๊ฐ์ฒด๊ฐ ์๋ฉธํ ๊ฒ์ด ์๋๋ค. ๋จ์ง ํ๋ฉด๋ง ์ถ๋ ฅ๋์ง ์์ ๋ฟ ์ฌ์ ํ ๊ฐ์ฒด๋ ์ด์์๋ค.
A ์กํฐ๋นํฐ์์ ์ธํ
ํธ๋ฅผ ๋ฐ์์์ผ B ์กํฐ๋นํฐ๋ก ํ๋ฉด ์ ํ์ด ์ด๋ฃจ์ด์ก์ ๋, A ์กํฐ๋นํฐ๋ onStop()
๊น์ง ํธ์ถ๋๋ค. ๋ฌผ๋ก A ์กํฐ๋นํฐ์ ๊ฐ์ฒด๋ ์๋ฉธํ์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ A ์กํฐ๋นํฐ๋ก ๋๋์๊ฐ๋ ๊ฒฝ์ฐ onRestart()
๋ฅผ ํธ์ถํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ onStart()
์ onResume()
๊ฐ ์ฐจ๋ก๋๋ก ํธ์ถ๋๋ค.
ํํ ์กํฐ๋นํฐ์ ์ํ ์ ์ฅ ๊ธฐ๋ฒ
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์กํฐ๋นํฐ๊ฐ ์ข ๋ฃ๋๋ฉด ์กํฐ๋นํฐ์ ๋ฐ์ดํฐ๋ ๋ชจ๋ ์ฌ๋ผ์ง๋ค.
๋ค์ ์คํ ์ ๋ณต์ ์์ผ์ผ ํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ํ ์ ์ฅ ๊ธฐ๋ฒ์ ์ด์ฉํด์ผ ํ๋ค.
๊ทธ๋ผ ์ด๋ฐ ์๋ฌธ์ด ์๊ธธ ์ ์๋ค.
"๊ทธ๋ฅ ์กํฐ๋นํฐ๊ฐ ๋ค์ ์คํ ๋ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋์ด์ค๋ฉด ๋๋ ๊ฑฐ ์๋๋?"
์ ๊น๋ง ์ข ๋ฃ๋์๋ค๊ฐ ๋ค์ ์์๋๋ ์กํฐ๋นํฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด๋ ๊ฒ์ ์๋ง์ง ์๋ค. ์์ฃผ ์ ๊น ์ฌ๋ผ์ก๋ค๊ฐ ๋ณต์๋๋ ๋ฐ์ดํฐ๋ฅผ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๊ฒ์ ์ด์ฉํ๋ ๊ฒ์ ๋๋ฌด ๊ณผ๋ํ๋ค๋ ์๋ฏธ์ด๋ค. ์ฆ, ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ํฌ๋ค.
๊ทธ๋ด ๋ ์ํ ์ ์ฅ ๊ธฐ๋ฒ
์ ์ฌ์ฉํ๋ฉด ์์ฃผ ๋ฑ์ด๋ผ ํ ์ ์๋ค.
๊ทธ๋ผ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๊ฒฝ์ฐ์ ์ด์ฉ์ ํ ๊น?
๋ฐ๋ก ํ๋ฉด ํ์
์ด๋ค.
onResume()
๊น์ง ํธ์ถ๋ 'ํ์ฑ ์ํ' ์์ ํ๋ฉด ํ์ ์ ํ ์๊ฐ onDestroy()
๊น์ง ํธ์ถ๋๋ฉด์ ์กํฐ๋นํฐ๋ ์ข
๋ฃ
๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณง๋ฐ๋ก ๋ค์ onResume()
๊น์ง ํธ์ถ๋์ด 'ํ์ฑ ์ํ' ๊ฐ ๋๋ค.
์ด ๊ฒฝ์ฐ ํด๋น ์กํฐ๋นํฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ ์๋ฉธ๋๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ ์๋ฉธ์ ์์น ์์ ๊ฒฝ์ฐ์, ์ด๋ฅผ ์ํ ์ ์ฅ
์ผ๋ก ์ปค๋ฒ์น ์ ์๋ค.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
}
onCreate()
, onSaveInstanceState()
, onRestoreInstanceState()
์ ๋งค๊ฐ๋ณ์
์ 3๊ฐ์ ๋ผ์ดํ์ฌ์ดํด ํจ์์ ๋งค๊ฐ๋ณ์ ํ์
์ด ๋ชจ๋ Bundle
์ด๋ค. ์ด๊ฑธ ์ด์ฉํ๋ฉด ๋๋ค.
Bundle
์ ์๋๋ก์ด๋์์ ์ ๋ช
ํ ํด๋์ค๋ผ๊ณ ํ๋ค. ๊ฐ๋จํ๊ฒ Map ๊ฐ์ฒด ์ ๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฆ, ๋ฐ์ดํฐ๋ฅผ K-V ์์ผ๋ก ์ ์ฅํ๋ค.
onSaveInstanceState()
๊ฐ ํธ์ถ๋๋ค๋ ๊ฒ์ ๊ณง ํด๋น ์กํฐ๋นํฐ๊ฐ ์ข
๋ฃ๋จ์ ์๋ฏธํ๋ค.
๊ทธ๋์ onSaveInstanceState()
์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ Bundle์ ๋ด์์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ์กํฐ๋นํฐ๊ฐ ์คํ ๋์์ ๋, onCreate()
ํน์ onSaveInstanceState()
์์ Bundle๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ํ๋ฉด ๋๋ค.
๋ฐ์ดํฐ์ ๋ฐ๋ผ UI ๊ตฌ์ฑ์ด ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
outState.putString("data1", "hello")
outState.putInt("data2", 10)
count = saveInstanceState.getInt("count")
Bundle ๊ฐ์ฒด์์ ๋ฐ์ดํฐ ํ๋์ getter() ํจ์๋ฅผ ์ด์ฉ
ํค๊ฐ๋ง ๋ช ์ํ๋ฉด ๋๋ค.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_cnt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="30dp"
android:textStyle="bold" />
<Button
android:id="@+id/btn_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="plus" />
<EditText
android:id="@+id/et_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp" />
</LinearLayout>
package com.kotdev99.android.c45
class MainActivity : AppCompatActivity() {
private var cnt = 0
private lateinit var editView: EditText
private lateinit var cntView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
cntView = findViewById(R.id.tv_cnt)
val btn = findViewById<Button>(R.id.btn_plus)
editView = findViewById(R.id.et_edit)
btn.setOnClickListener {
cnt++
cntView.text = "$cnt"
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("cnt", cnt)
outState.putString("edit", editView.text.toString())
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
cnt = savedInstanceState.getInt("cnt")
cntView.setText("$cnt")
editView.setText(savedInstanceState.getString("edit"))
}
}