Android-Fundamental
์ด ๊ธ์ ๋ค์ด๋ฒ์ ๋ ธ์ฌ์ถ ๊ฐ๋ฐ์๋๊ป์ ์ฃผ์ ์ง๋ฌธ์ง์ด๋ฉฐ ์ ์ค์ค๋ก์๊ฒ ๋ต์ ํด๋ณด๊ณ ์ ๋ง๋ ๋ต๋ณ๋ค์ ๋๋ค.
Disclaimer
์๋ชป ์๊ฑฐ๋ ๋ชจ๋ฅด๋ ๊ฒ์ด ๋ง์ต๋๋ค. ์
๋ฐ์ดํธ๊ฐ ํ์ํ ๋ถ๋ถ์ MR ์ ํตํด ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฐ์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํนํ ? ๋ฌธ์๋ก ์์ํ๋ ๋ต๋ณ์ ํ๋ฆฐ ๋ต๋ณ์ผ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค.
Binder ๊ฐ๋ ๊ณผ Binder์์ ๋ฐ์ ๊ฐ๋ฅํ ๋ฌธ์
? ํ๋ก์ธ์ค๊ฐ ํต์ ์ ์ํด์ ๋ง๋ ๊ฒ
-
๋ชจ๋ฐ์ผ ํ๋ซํผ์์ ๊ธฐ์กด Socket ์ด๋ File ์ ์ถ๋ ฅ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ํจ์จ์ ์ด๊ณ ๋น ๋ฅธ ํ๋ก์ธ์ค ํต์ ์ ์ํด ๋ง๋ค์ด์ง. ํ๋ก์ธ์ค๊ฐ ํต์ ์ด๊ธฐ ๋๋ฌธ์ Binder๋ฅผ ํตํด ์ ๋ฌํ ์ ์๋ ๋ฐ์ดํฐ ํฌ๊ธฐ์ ์ ํ์ด ์์. ๋น์ง๋์ค ๋ก์ง์ด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ฑฐ๋ ๋๋ฌด ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ RemoteException / ANR๋ฑ์ด ๋ฐ์ํ ์ ์์.
-
๋ฆฌ๋ ์ค ์ปค๋๋ ๋ฒจ์์ ์ ๊ณตํ๋ IPC ๋ฉ์นด๋์ฆ
-
์ผ๋ฐ์ ์ธ IPC ์๋ ๋ค๋ฅด๊ฒ fd๋ shmem๊ฐ์ OS๋ ๋ฒจ์ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์์
-
์๋๋ BeOS์์ ์ฌ์ฉํ๋ IPC ๋ฉ์นด๋์ฆ์ด์์ง๋ง, OpenBinder๋ผ๋ ํ๋ก์ ํธ๋ก ๋ฆฌ๋ ์ค์ ํฌํ ๋จ. (ํต๋ณธ ์ฌ์ฌ๋ ๋ง๋ง์ธ)
-
Ref
by @suribada ์ง๋ฌธ ์๋: ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๋ํ ๊ฐ๋ ์ด ์๋๊ฐ? ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐํ๋ฉด์ Binder๋ผ๋ ๊ฑธ ๊ณ ๋ คํ ๋๊ฐ ์๋๊ฐ?
๋ต๋ณ: (์ ๋ต๋ณ์ ๋ํด์) ์ฑ์ ๊ฐ๊ฐ ๋ณ๋ ํ๋ก์ธ์ค์ด์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฃผ๊ณ ๋ฐ์ ๋๊ฐ ์๋ค. ์ด๋ Binder๊ฐ ์ฌ์ฉ๋๋ค. ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๋ํ์ ์ผ๋ก ContentProvider๋ Aidl์ ์ฌ์ฉํ Remote ์๋น์ค๊ฐ ์๋ค. Binder๋ฅผ ํตํ ๋ฐ์ดํฐ ํฌ๊ธฐ ์ ํ์ด ์๊ณ , ๋ํ์ ์ธ ๊ฒ์ผ๋ก Bitmap์ ์ง์ ์ ๋ฌํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ด์ Uri๋ง ์ ๋ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
Zygote
? pid 1 ์ ๊ฐ์ง ํ๋ก์ธ์ค๋ก ์๋๋ก์ด๋์์ ์ฑ์ ์คํ์ ๊ด์ฅํ๋ ๋ ์
-
์๋๋ก์ด๋ ๋ชจ๋ ์ฑ ํ๋ก์ธ์ค๋ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ ๋ฐ ๋ก๋๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์. ๋งค๋ฒ ์ฑ ์์์๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ์ฒ์๋ถํฐ ๋ง๋ค์ด์ ํ์ํ ์ด๊ธฐ ์์ ์ ์ํํ๋๋ฐ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆผ. ์ด ๋ถ๋ถ์ ๊ฐ์ํํ๊ธฐ ์ํด ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ํด๋ ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ฌ - Zygote. ๋ค๋ฅธ ์ฑ ํ๋ก์ธ์ค๋ ํด๋น ํ๋ก์ธ์ค๋ฅผ fork (clone)ํ๋ ํ์์ผ๋ก ์์ฑํจ. ์๋๋ก์ด๋ Q ๋ฒ์ ๋ถํฐ๋ Zygote ๋์ common process pool์ ์ ์งํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋จ (fork์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ค์ฌ์ค). ๋ฐ๋ผ์ Q ์ดํ์๋ Zygote๊ฐ ์์ด์ง ์์ .
-
art runtime ๊ตฌ๋์ ์ ํ์ํ framrwork์ class๋ฐ resource๋ฅผ preloadํ๊ณ ์๋ process
-
ActivityManagerService์ ์์ฒญ์ ๋ฐ๋ผ, uid, ๊ฐ์ข sandbox ์ค์ ์ ๊ตฌ์ฑํ ๋ค์ ActivityThread.main ์ ์ํํด, ์ฑ์ด ์ฌ๋น ๋ฅด๊ฒ ๊ตฌ๋๋๊ฒ ๋์์ค
by @suribada ์ง๋ฌธ ์๋: fork๋ก ์ฑ์ด ์๋ก ๋ง๋ค์ด์ง๋ ๊ฒ๊ณผ, ์๋๋ก์ด๋์ ๋ถํ ์ ๋ฉ์ปค๋์ฆ์ ๋ณด์๋๊ฐ?
ํ๋ก์ธ์ค ์ฐ์ ์์
? ํ๋ก์ธ์ค์ ์ฐ๋ ๋์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ ์ ์์ผ๋ฉฐ ์ด๋ ๋์์ฑ ๋์์ ์ฐ์ ์์ ๊ฐ์ ๋ฐ๋ผ์ ์ฐ์ ๋์์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋๋ค.
by @suribada
-
์ง๋ฌธ์๋: https://developer.android.com/guide/components/processes-and-threads ๋ฌธ์๋ฅผ ์ฝ์ด๋ดค๋์ง ํ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ์ ๋ฌธ์ ์์ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ค์ด ํ๋ก์ธ์ค ์ฐ์ ์์๋ฅผ ์ดํดํ๋ฉด ํด๊ฒฐ์ด ์ฌ์์ง๊ธฐ๋ ํ๋ค.
- ๋ต๋ณ: ํฌ๊ทธ๋ผ์ด๋/๊ฐ์์ /์๋น์ค/๋ฐฑ๊ทธ๋ผ์ด๋/๋น ํ๋ก์ธ์ค ์์. ๋น ํ๋ก์ธ์ค๋ ์บ์ ์ฉ๋๋ก ๋จ์์์ง๋ง, ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋ ์ ์๋ค.
- ํ๋ก์ธ์ค ์ฐ์ ์์ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์๋ค. Activity์ onDestroy๊ฐ ๋ฐ๋์ ๋ถ๋ฆฐ๋ค๋ ๋ณด์ฅ์ด ์๋ ์ด์ ๊ฐ์ด๋ฐ ํ๋๋ค.
- ์ฑ ์์ ฏ์์ AsyncTask๋ฅผ ์จ๋ ์ ๋๊ธฐ๋ ํ๋ค. ์ฑ ์์ ฏ์ด ์ ๋ฐ์ดํธ ์ ๋๋ค๊ฐ ์ฑ์ ์คํํ๊ณ ๋๋ฉด ์ ๋ฐ์ดํธ ๋๋ค๊ณ ๋ฌธ์๊ฐ ๋ค์ด์ค๊ฒ ๋๋ค.
- ์ฑ ์์ ฏ๋ BroadcastReceiver๋ผ์ onReceive()๊ฐ ๋๋์๋ง์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์คํ๋๊ณ ์์ง ์๋ค๋ฉด ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ์๋๋ก ๋ด๋ ค๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๊ฐ๋ฅ์ฑ์ด ๋ง๋ค.
- ์ฆ ์ฑ ์์ ฏ์์ ๋น๋๊ธฐ ๋์์ ํ๋ ค๋ฉด ๋ค์ ์๋น์ค์ ๋๊ฒจ์ ์๋น์ค์์ ์งํํด์ผ๋ง ํ๋ค.
- ์๋ ๋์ค๋ ์ง๋ฌธ ๊ฐ์ด๋ฐ BroadcastReceiver์์ Toast๋ฅผ ๋์๋ ๋๋๊ฐ ํ๋ ๊ฒ๋ ํ๋ก์ธ์ค ์ฐ์ ์์๋ฅผ ์ดํดํ๋ฉด ๋๋ค.
by @huewu
-
์๋๋ก์ด๋ ํ๋ซํผ์์ ํ๋ก์ธ์ค ํด๋น ํ๋ก์ธ์ค์์ ๋์ํ๋ ์ฑ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ์์ ํ์ฌ ์์ ๊ณผ ์ผ๋ง๋ ์ง์ ์ ์ธ ์ฐ๊ด์ด ์๋๊ฐ์๋ฐ๋ผ ๊ฒฐ์ ๋จ. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํ์ฌ ์ฌ์ฉ์ค์ธ ์กํฐ๋นํฐ๋ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋๊ณ , ์๋ฌด๋ฐ ์ฑ ์ปดํฌ๋ํธ๊ฐ ๋์ํ์ง ์๋ ํ๋ก์ธ์ค(EMPTY_PROCESS)๋ ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์.
-
ํ๋ก์ธ์ค ์ฐ์ ์์๋ ํฌ ๊ฒ ๋๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋จ. ์ฐ์ , Low Memory Killer๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ๋ณด๋ฅผ ์ํด ํ๋ก์ธ์ค๋ฅผ Kill ํด์ผํ๋ ๊ฒฝ์ฐ, ์ฐ์ ์์๊ฐ ๋ฎ์ ํ๋ก์ธ์ค๋ถํฐ Killํจ. ๋ ๋ฒ์งธ๋ก, ํ๋ซํผ ๋์ ๊ตฌํ ์ ํ๋ก์ธ์ค ์ฐ์ ์์์ ๋ฐ๋ผ ๋์์ด ๋ณ๊ฒฝ๋ ์ ์์. ์๋ฅผ ๋ค์ด, Doze ๋ชจ๋ ์ง์ ์, ForegroundService๋ฅผ ๊ฐ๊ณ ์๋ ํ๋ก์ธ์ค๋ Doze ์ ์ฝ์ ํผํ ์ ์์ง๋ง, ๊ทธ ๋ณด๋ค ๋ฎ์ ์ฐ์ ์์์ ํ๋ก์ธ์ค๋ Doze ์ ์ฝ์ ๋ฐ๊ฒ๋จ.
Low Memory Killer์ OOM Killer์ ์ฐจ์ด
? Low Memory Killer ํ์ฌ foreground ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์๋ก ํ๋ ๊ฒฝ์ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋ค๋ฅธ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐํํ์ฌ Foreground ์ฑ์ ์ํ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๊ณ ์ ํฉ๋๋ค. ๋ฐ๋ฉด OOM Killer ๋ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ๋ณด๊ฐ ์ฑ ์ด๋ฃจ์ด์ง๊ธฐ ์ ์ด๊ฑฐ๋ ๋์ด์ ํ๋ณดํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ํ ๋นํ๋ ์ก์ ์ด ๋ฐ์ํ ๋ ํด๋น ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋๋ก ํฉ๋๋ค.
by @huewu
- Low Memory Killer๋ OOM์ด ๋ฐ์ํ๊ธฐ ์ ์ ํ๋ซํผ์์ ์ ์ ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ๋ณด๋ฅผ ์ํด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ์ํค๋ ๊ฒ. ๋ฐ๋ผ์ ์ฐ์ ์์๊ฐ ๋ฎ์ ํ๋ก์ธ์ค๋ถํฐ ์ข ๋ฃํ๊ฒ ๋จ. Out of Memory Killer๋ ์ ๋ง๋ก allocataeํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์์๋ ๋ฐ์ํ๋ฉฐ, ํ๋ก์ธ์ค ์ฐ์ ์์ ๊ด๊ณ์์ด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ์ ์์. ๋ฐ๋ผ์, ์ฑ runtime crash๋ kernal crash๊ฐ ๋ฐ์ํ ์ ์์.
Ref
by @suribada ์ง๋ฌธ ์๋: ํ๋ก์ธ์ค ์ฐ์ ์์๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๋๊ฐ? OOM Killer์ ์ ๊ตฌ๋ถ๋๋๊ฐ?
๋ต๋ณ: (์ ๋ต๋ณ์ ๋ํด์) OOM Killer ๋์ํ๊ธฐ ์ด์ ์ Low Memory Killer๊ฐ ๋์ํ๋ค. OOM Killer๋ ์ฃผ ๋์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ์ข ๋ฃ์ํค๋๋ฐ, Low Memory Killer๊ฐ ์ฐ์ ์์์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ด๋ ๋ ธ๋ ฅ์ ๋จผ์ ํ๊ณ ๋์ ํ ์ ๋ ๋ OOM Killer๊ฐ ๋์ํ๋ค.
ํ๋ก์ธ์ค ๋ถ๋ฆฌ ์ด์ ๋์
? ์ฃผ๋ก ์์ฃผ ์๋น์ค ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์ธํ ๋ ๋ง์ด ์ด์ฉ๋๋ค. ์์ฃผ ์๋น์ค๋ ๊ทธ ํน์ฑ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฅ๊ธฐ๊ฐ ์ ์ ํ๋๋ฐ ๋ฉ์ธ ์ฑ์ ์ข ์๋ ํ๋ก์ธ์ค๋ก ์ ์ธํ๊ฒ ๋๋ฉด ๋ฉ์ธ ์ฑ๊ณผ ์ปดํจํ ์์์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์๋น์ค๊ฐ ์๋์ ์ด์ง ์์ ์ํฉ์ ์ข ๋ฃํ ์ํฉ์ด ๋งค์ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๋ณ๋์ ํ๋ก์ธ์ค๋ก ์ ์ธํ์ฌ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณ๋๋ก ๋์ํ๋๋ก ํ๋ค. ๋ค๋ง ์ด๊ฒฝ์ฐ Preference ๋ฑ ๋ด๋ถ ์ธํฐํ์ด์ค๋ก ๋ฉํฐ ํ๋ก์ธ์ค๋ฅผ ์ง์ํ์ง ์๋ ์์์ ๊ณต์ ํ๋ ค ํ ๊ฒฝ์ฐ ์๋ก๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์์ฑ ๋ฐ์ดํฐ๋ ContentProvider ๋ฅผ ํตํด์ ์์์ ๊ณต์ ํ๋ ๊ฒ์ด ์ข๋ค.
by @huewu
- ๋ํ์ ์ผ๋ก ์์
์ฌ์์ ์ํ ํฌ๊ทธ๋ผ์ด๋ ์๋น์ค๋ฅผ ๋ณ๋์ ํ๋ก์ธ์ค๋ก ๋ถ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ (์ถ์ฒ๋จ). ๋ง์ผ ์์
์ฑ์ด ํ๋์ ํ๋ก์ธ์ค๋ก ์ด๋ฃจ์ด์ ธ์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ๋ฐ์ํจ
- UI ์์ ์ค๋ฅ ํน์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์ฑ ์ข ๋ฃ ํน์ ์ฌ์์์ ์ฌ์์ค์ธ ์์ ์ด ๋๊ธธ ์ ์์.
- ์ฌ์ฉ์๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ฌ์์ ์ํด ์ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ฑ UI์ ๊ด๋ จ๋ ์ฝ๋๋ค๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผ๋์ด ์์ด์ผํจ. ๋ถํ์ํ๊ฒ ์์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋จ.
by @suribada ์ง๋ฌธ ์๋: ํ๋ก์ธ์ค ๋ถ๋ฆฌ๋ฅผ ํด๋ณธ ์ ์ด ์๋๊ฐ? ๋ถํ์ํ๊ฒ ํ๋ก์ธ์ค๋ฅผ ๋ถ๋ฆฌํ ๊ฑด ์๋๊ฐ?
๋ต๋ณ: (์ ๋ต๋ณ์ ๋ํด์) ์ฑ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ด ์๋ค.
Http Call ๋ฐฉ๋ฒ(library?)
์ด์ฐฝ๊ธฐ์๋ Java ์ ๊ธฐ๋ณธ http api ์ธ HttpClient ๋ฅผ ๋ง์ด ์ฌ์ฉํ์์ผ๋ ํ์ฌ๋ OkHttp ๊ฐ ๋๋ฆฌ ํต์ฉ๋๊ณ ์๋ค. OkHttp ๋ ์ ์์ค์ ๊ตฌํ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ณ ๋ ๋ฒจ์ ๊ตฌํ์ฒด๋ก Retrofit ์ ๋ง์ด ์ฌ์ฉํ๋ค. Retrofit ์ ๊ธฐ๋ณธ๋์์ด ๋น๋๊ธฐ์ฑ์ด๋ฉฐ ๊ฐ ๋จ๊ณ๋ณ๋ก ๋ค์ํ Interface ๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ Http ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ ์ฅ์ ์ด ์๋ค.
by @suribada ์ง๋ฌธ ์๋: ์์ ๋ฐฉ์์ผ๋ก ์ฌ์ ํ ํ๊ณ ์๋์ง ์ ๋๋ฅผ ํ์ ํ๊ธฐ ์ํ ๊ฒ์ด๋ค. Apache HttpClient๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์ ์์ง ์ฌ์ฉํ๋์ง ๋ฌธ์ ๋ ๋ฌด์์ธ์ง(์ deprecated ๋์๋์ง๋.. Apache HttpClient๊ฐ ํ์ ํธํ์ฑ์ ๊ฑฐ์ ๊ณ ๋ คํ์ง ์๊ณ ๋ง๋ค์ด์ง), HttpUrlConnection์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์ ์ฌ์ฉํ๋์ง ๋ฒ๊ฑฐ๋ก์ด ์ ์ด ๋ฌด์์ธ์ง, Retrofit์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด RxJava๊น์ง ํจ๊ป ์ฌ์ฉํ๋์ง(๊ธฐ์ Retrofit๋ฅผ ์ฌ์ฉํ๋ค๋ฉด RxJava๋ฅผ ์ฐ๋๊ฒ ๋จ์ํด์ง), ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ ์ฌ์ฉํ๋์ง.
ActivityThread
by @suribada ์ง๋ฌธ ์๋: Call Stack์ ๊ฐ์ฅ ์๋์ ์๋ ActivityThread๋ฅผ ์ดํด๋ดค๋์ง ์์๋ณธ๋ค. ํฌ๋์๊ฐ ๋ฐ์ํ ๋๋ ์์ฃผ ๋ณด๊ฒ ๋๋ค.
๋ต๋ณ: main ๋ฉ์๋๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์ด๋ค. ๋ฉ์ธ ๋ฃจํผ๊ฐ ์์ฑ๋๊ณ ๋ฉ์ธ ์ค๋ ๋ ์ด๋ฒคํธ ํ๊ฐ ์ฌ๊ธฐ์ ๋์ํ๋ฉด์ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ system_server ํ๋ก์ธ์ค์ ActivityManagerService์์ ํต์ ๋ ๋ด๋นํ๋ค.
by @huewu
- ?Application Main Thread.
ActivityThread์ ActivityManagerService๊ฐ์ ํต์
??? ์๋ง๋...RPC ํต์ ? AOSP ์ฝ๋ ๋ฏ์ด๋ณธ ๊ธฐ์ต์๋ AIDL ์ ์ด์ฉํ RPC ํต์ ์ด๋ค. ๊ณผ๊ฑฐ ์ด AIDL ์ ์ค๋ดํ ํด์ ๊ธฐ๊ธฐ์ ์ ์ฒด ์ฑ Lifecycle ์ ๋ชจ๋ํฐํ๋ ์๋น์ค๋ฅผ ๋ง๋ ์ ์ด ์๋ค.
by @suribada ์ง๋ฌธ ์๋: ์ธ๋ถ ํ๋ก์ธ์ค์ธ system_server์ ํต์ ํ๋ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ํ์ธํด๋ณด์๋๊ฐ?
๋ต๋ณ: aidl๋ก ์์ฑํ ๊ฑด ์๋๊ณ ApplicationThread๋ผ๋ Stub ๊ตฌํ์ด ์์ด์ sytem_server์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
ANR
UI Thread ์์ Network IO, File IO, ๋ฐ๋ณต๋ฌธ ๋ฑ ์ง๋์น๊ฒ ๋ง์ ์๊ฐ์ ์์ํ๊ฒ ๋ ๊ฒฝ์ฐ Not Response ๋ก ์ธํ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. anr ์ด ๋ฐ์ํ ๊ฒฝ์ฐ /data/anr/trace.txt ๋ฅผ ์ถ์ถํ์ฌ ์ด๋ ์ฐ๋ ๋๊ฐ ๋ธ๋ญํ๊ณ ์ด๋ ์ฐ๋ ๋๊ฐ ๋๊ธฐ์ค์ธ์ง ํ์ ํ ์ ์๋ค. ์ผ๋ถ ๊ธฐ๊ธฐ๋ ๋ฐ๋ก ์ถ์ถ์ด ๊ฐ๋ฅํ๋ฉฐ ์ผ๋ถ ๊ธฐ๊ธฐ๋ adb-shell ๋ก ํด๋น ํ์ผ์ sdcard ์์ญ์ผ๋ก ๋ณต์ฌํ ๋ค์ ์ถ์ถํ ์ ์๋ค.
by @huewu
- Main Thread๋ ๋ฉ์์ง Queue ํ์์ผ๋ก ๋์. ํด๋น Queue์์ ์ผ์ ์๊ฐ๋ด์ ์์ ์ด ์๋ฃ๋์ง ์์ผ๋ฉด ANR์ด ๋ฐ์ํจ. ANR์ด ๋ฐ์ํ๋ ๊ธฐ์ค์ Main Thread์์ ๋์ํ๊ณ ์๋ Application Component์ ๋ฐ๋ผ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง. ์๋ฅผ๋ค์ด Activity์ ๊ฒฝ์ฐ 5์ด. Broadcast Receiver์ ๊ฒฝ์ฐ ์กฐ๊ธ ๋ ๊ธด ๊ฒฝ์ฐ๊ฐ ๋ง์ (10์ด)
by @ted
- Application Not Responding์ ์ค์๋ง
- ํ๋ฉด์ ํฐ์นํ๊ณ ๋์ 5์ด์์ ์๋ต์ด ์๋๊ฒฝ์ฐ ๋ฐ์ํจ : BroadcastReceiver์ ์ด์๋ ์์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ๋ ์์ ์ด์ ๋๋ฌธ
- ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋๋ฆด๋ฒํ ๋ฌด๊ฑฐ์ด ์์ ์ UI์ฐ๋ ๋์์ ๋๋ฆฌ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํจ
- ์์ ์ ์๋ฒํต์ ์ ํ ๋ UI์ฐ๋ ๋์์ ๋๋ฆฌ๋ฉด ์ด๋ฐ ์๋ฌ๊ฐ ๋ฐ์ํ์๊ณ AsyncTask๋ฅผ ์ฐ๋๋ผ๋ ์ ๋๋ก ์ฒ๋ฆฌํด์ฃผ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ : ์์ฆ์๋ ์น์ ํ๊ฒ UI์ฐ๋ ๋์์ ํ์ง ๋ง๋ผ๋ ๋ฉ์ธ์ง์ ํจ๊ป ์๋ฌ๋ฅผ ๋ฐ์์์ผ์ค
- RxJava, Coroutine์์ ์ฐ๋ ๋ ์ค์ผ์ค๋ฌ ๊ด๋ฆฌ๋ฅผ ์์ ์ ๋ง๊ฒ ์ ์ ํ ์์ผ์ค์ผ ํ๋ ์ด์ ์ด๊ธฐ๋ ํจ
by @suribada ์ง๋ฌธ ์๋: ANR์ ๋ชจํธํ๊ฒ ์ดํดํ๋๊ฐ?
๋ต๋ณ: (์ ๋ต๋ณ์ ๋ํด์) ๋ช ์์ ์ผ๋ก(AsyncTask, IntentService ๋ฑ์ ํฌํจํด์) ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด, ๊ธฐ๋ณธ์ ๋ชจ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ ์ ํ๋ ๋์์ด๋ค. Service๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ค๊ณ ํด์(UI๊ฐ ์๋๋ผ๋ ์๋ฏธ์ผ ๋ฟ์ธ๋ฐ..) ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํดํ ์ ์์ง๋ง ์ค๋ ๋ ์์ฑํ์ง ์๋๋ค๋ฉด onStartCommand()๋ ๋ฉ์ธ ์ค๋ ๋์์ ๋์ํ๋ค. ์ด๋๋ฌธ์ Activity์ ๋์์ด ๋ฉ์ถ ์๋ ์๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ ๋๋ฌธ์ ANR์ด ์๊ธธ ์๋ ์๋ค.
Looper/Handler/MessageQueue
ํน์ ์ฐ๋ ๋์์ ๋์ํ๋๋ก ์คํํ ์ ์๋ ์ธ๋ถ ์ธํฐํ์ด์ค๋ก Handler ๊ฐ ์์ผ๋ฉฐ ์ด Handler ๋ ์ ์ธํ๋ ์์ ์ Thread ์ ์ข ์๋๋ค. Handler ๋ฅผ ํตํด ๋์ํ๋ Runnable ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ฉด ์ด๋ Message Queue ์ ๋ด๊ฒจ์ ธ์๋ค๊ฐ Looper ๊ฐ Queue ์์ ํ๋์ฉ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ ๋์ํ๋๋ก ํ๋ค.
by @suribada ์ง๋ฌธ ์๋: Handler์์ ๋ณด๋ด๋ ๋ชจ๋ Message๋ MessageQueue๋ฅผ ๊ฑฐ์ณ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ ์ดํดํ๊ณ ์๋๊ฐ?
๋ต๋ณ: (์ ๋ต๋ณ์ ๋ํด์) Looper๊ฐ MessageQueue๋ฅผ ์ ์งํ๋ค. Handler๋ MessageQueue์ Message๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ ํ๋ค.
Looper๋ ๋ช ๊ฐ?
Thread ๋น 1๊ฐ
by @suribada ์ง๋ฌธ ์๋: Thread Local Storage์ Looper๊ฐ ์ ์ฅ๋๋์ง ์ดํดํ๋๊ฐ?
๋ต๋ณ: Thread Local Strorage์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๋น 1๊ฐ์ด๋ค. ๋ฉ์ธ Looper๋ ์ฑ์ด ์ฒ์ ๊ตฌ๋๋๋ฉด์ ActivityThread์์ ์์ฑํด๋๊ณ ๋ฉ์ธ ์ค๋ ๋์ ์ด๋ฒคํธ ํ ์ญํ ์ ํ๋ค. ๋ค๋ฅธ ์ค๋ ๋์์๋ Looper.prepare()๋ก Thread Local Storage์ ์๋ก ์์ฑ๋๋ค. ์ด๋ฏธ ํ๋ ์์ฑ๋์๋๋ฐ ๋ ๋ค์ prepare()๋ก ์์ฑ ์๋ํ๋ฉด ํฌ๋์๊ฐ ๋ฐ์ํ๋ค.
Message object pool, Message.obtain ์ฐ๋ ์ด์ .
? Message ๊ฐ Handler ์ ์ข ์๋์์์ ์ ์ธํ๊ธฐ ์ํจ
by @huewu
- ๋ชจ๋ UI Event ๋ฐ ๋๋ถ๋ถ์ System ์ํธ์์ฉ์ Message ํํ๋ก ์ฒ๋ฆฌ๋จ. ๋ฐ๋ผ์, Message Ojbect๋ ๋งค์ฐ ๋ง์ด ๊ทธ๋ฆฌ๊ณ ์์ฃผ ์ฌ์ฉ๋จ. ์ด ๋ ๋งค๋ฒ ์์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ ์ญ์ ํ๋ฉด ์์คํ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ค ์ ์์. ๋ฐ๋ผ์ ๋๋ฌด ๋น๋ฒํ Message object ์์ฑ ๋ฐ ์ญ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, Object Pool ํํ๋ฅผ ์ ์งํด Message object๋ฅผ ์ฌํ์ฉ.
by @suribada ์ง๋ฌธ ์๋: new Message()๋ฅผ ์ฐ์ง ์๊ณ Message.obtain()์ ์ ๊ถ์ฅํ ๊น?
๋ต๋ณ: (์ ๋ต๋ณ์ ๋ํด์) new Message()๋ก ์์ฑํด๋ ๊ฒฐ๊ตญ ์ฌ์ฌ์ฉ์ ์ํ recycle() ๋ฉ์๋๋ ํธ์ถํด์ ์ค๋ฒํค๋๋ง ์ฆ๊ฐํ๋ ์ ์ด๋ค.
message object pool ๊ฐ์
???
by @huewu
- Application Process๋น 1๊ฐ?
by @suribada ๋ต๋ณ: Message์ static ๋ณ์๋ก ์๊ธฐ ๋๋ฌธ์ 1๊ฐ๊ฐ ๋ง๋ค. ๊ฐ์๊ฐ ์ค์ํ์ง ์์ง๋ง pool์ ์ต๋ Message ๊ฐ์๋ 50๊ฐ๋ค.
message object pool์ ์ด๋์ ์ด๋ค ํํ๋ก?
???
by @suribada ๋ต๋ณ: Message์ next ๋ณ์๊ฐ ์์ด์ ๋งํฌ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค.
Handler ์ฉ๋
์ผ๋ฐ์ ์ธ ์ฉ๋๋ Background Thread ์์ UI Thread ๋ก ๋์์ ์ ํํ๊ณ ์ ํ ๋ Handler ๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
by @huewu
- LooperThread์ ์ฐ๊ฒฐ๋ Looper๋ก Message๋ฅผ ์ ๋ฌํ๊ณ (sendMessage), ์ ๋ฌ๋ Message๋ฅผ ์ฒ๋ฆฌํ๋ ์ญํ (handleMessage). ๋ํ Messenger ํํ๋ก ๊ฐ์ผ ํ ๋ค๋ฅธ Process๋ก ์ ๋ฌ๋์ด IPC ์ฑ๋์ ๋ง๋๋๋ฐ๋ ์ฌ์ฉ๋ ์ ์๋ค.
by @suribada ์ง๋ฌธ ์๋: Handler๋ฅผ ์ด๋ค ์ฉ๋์ ์ฌ์ฉํด ๋ณด์๋๊ฐ?
๋ต๋ณ: ๋ฐฑ๊ทธ๋ผ์ด์์ UI ์ ๋ฐ์ดํธ, ๋ฉ์ธ ์ค๋ ๋์์ ๋ค์ ์์ ์์ฝ, ๋ฐ๋ณต UI ๊ฐฑ์ , ์๊ฐ ์ ํ ๋ฑ
View์์ getParent() ๋ฉ์๋๊ฐ ๋ฐํํ๋ ViewParent๋?
??? by @suribada ์ง๋ฌธ ์๋: View์ getParent() ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฒ ViewGroup์ด ์๋ ViewParent์ธ๋ฐ ์๋ฌธ์ ๊ฐ์ ธ๋ณด์๋๊ฐ?
๋ต๋ณ: ์ผ๋ฐ์ ์ผ๋ก๋ getParent() ๋ฉ์๋ ๊ฒฐ๊ณผ๋ฅผ ViewGroup์ผ๋ก ์บ์คํ ํ๋ค. ViewParent๋ฅผ ๊ตฌํํ ๊ฒ์ ViewRootImpl๊ณผ ViewGroup์ด ์๋ค. ๋ด๋ถ์ ์ผ๋ก ์ฐ์ด๋ ๊ฒ ViewRootImpl์ด๋ค.
ViewRootImpl์ ์ฉ๋๋?
???
by @suribada ์ง๋ฌธ ์๋: ViewRootImpl๋ Call Stack์์ ์์ฃผ ๋ณผ ์ ์๋๋ฐ ํ์ธํด๋ณด์๋๊ฐ?
๋ต๋ณ: getParent()๋ฅผ ๊ณ์ ์ฌ๋ผ๊ฐ๋ค ๋ณด๋ฉด ๊ฐ์ฅ ์์ ViewGroup์ด ์๋ค(๊ตฌ์ฒด์ ์ผ๋ก๋ PhoneWindow$Decorview). View์์ invalidate()๋ฅผ ํธ์ถํ๋ฉด ๋ค์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ์ ์ฒด View ํธ๋ฆฌ ์์์ ์คํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ViewGroup์ ์๊พธ ํธ์ถํ๊ณ ๊ฐ์ฅ ์์ ViewGroup์์ ๋ค์ ๊ทธ๋ฆฌ๋ผ๊ณ ํ ์๋ ์์๊ฒ ์ง๋ง, ๋ค์ ๊ทธ๋ฆฌ๋ ์์ ์ ViewGroup์์ ํ์ง ์๊ณ ๋ก์ง์ ๋ถ๋ฆฌํ ๊ฒ์ด ViewRootImpl์ด๋ค. getParent()๋ก ๊ณ์ ์ฌ๋ผ๊ฐ์ ์ต์ข ์ผ๋ก ๊ฐ์ ธ์ค๋ ViewRootImpl์ด ๊ฒฐ๊ตญ ์ต์์ ๊ณ์ธต ์ญํ ์ ํ๊ณ ์ฌ๊ธฐ์ View ํธ๋ฆฌ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ํ๋ค.
AsyncTask ์ฌ์ฉ ์ ๋ฌธ์ ์
ICS ์ด์ ์ ๊ฒฝ์ฐ AsyncTask ๊ฐ ๋ฒ์ ๋ณ๋ก ThreadPool ๊ด๋ฆฌ, ๋์์ฑ ๋ค์ค์ฒ๋ฆฌ ๋ฑ์ด ๊ท ์ผํ์ง ์์ OS ๋ฒ์ ๋ณ๋ก ์๋๋ ๋์์ด ๋ฌ๋์ผ๋ ํ์ฌ๋ Min-SDK ๊ฐ ICS ์ดํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ง๋ ๊ฐ๋ฅ์ฑ์ ์์ด์ก๋ค.
๊ณ ์ ์ ์ธ ์ด์๋ inner class ๋ก ์ ์ธํ์ ๋ ๋ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฆญ๊ณผ Lifecycle ์ ์ํ ์ ์ด ์ฒ๋ฆฌ๊ฐ ๋ฏธํก ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. anonymous inner class ๋ก ์ ์ธํ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ ์ค์๊ฐ View ๊ฐ์ฒด์ ๋ฐ๋ก ์ ๊ทผํ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ด ๊ฒฝ์ฐ ํด๋น Activity/Fragment ๊ฐ ์ข ๋ฃ ๋์ด๋ ์ํ ์ฐธ์กฐ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐ์ํ ์ ์๋ค. ๋ํ ํ๋ฉด์ด ์ข ๋ฃ๋์ด๋ AsyncTask ๋ฅผ ๋ณ๋๋ก ์ข ๋ฃํ์ง ์๋๋ค๋ฉด ์๋์น ์๊ฒ ์ปดํจํ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
by @suribada ์ง๋ฌธ ์๋: AsyncTask๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ด๋ค ๋ฌธ์ ๊ฐ ์์๋๊ฐ?
AsyncTask ์ทจ์
? AsyncTask.cancel()?? ํ์ง๋ง ์ด๊ฒฝ์ฐ Thread-Interrupt ๊ฐ ๋ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ doInBackground ์์ for-loop ์ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ด ์๋ค๋ฉด ๋ฐ๋ณต๋ฌธ ๋ด๋ถ์ Thread ๊ฐ ์ข ๋ฃ๋์๋์ง ํ์ธํ๋ ์ถ๊ฐ์ฝ๋๊ฐ ํ์ํ๋ค.
by @suribada ์ง๋ฌธ ์๋: cancel() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ณธ ์ ์ด ์๋๊ฐ?
๋ต๋ณ: cancel() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด isCancelled() ๋ฉ์๋๊ฐ true๋ฅผ ๋ฐํํ๋๋ฐ, doInBackGround() ์์๋ isCancelled() ๋ฉ์๋๋ก ์์ฃผ ์ฒดํฌํ๋ ๋ก์ง์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
mayInterruptIfRunning์ ์๋ฏธ
???
by @suribada ์ง๋ฌธ ์๋: cancel(true ๋๋ false) ๊ตฌ๋ถ์ ํ๊ณ ์๋๊ฐ?
๋ต๋ณ: doInBackground() ์ค๋ ๋์ ์ธํฐ๋ฝํธํ ๊ฒ์ธ์ง์ด๋ค. true๋ฅผ ์ ๋ฌํด๋ ์ค์ ์ค๋ ๋๊ฐ ์ข ๋ฃํ๋์ง๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. Tread์ sleep(), join() ๋ฉ์๋๊ฐ ์คํ์ค์ด๊ฑฐ๋ Object์ wait()๊ฐ ์คํ ์ค์ด๋ผ๋ฉด InterruptedException์ด ๋ฐ์ํ ๊ฒ์ด๊ณ , doInBackground()์์ Thread.interrupted()๋ก ์ฒดํฌํ๊ณ ์๋ค๋ฉด ์ข ๋ฃ ๊ฐ๋ฅํ ์ ์๋ค.
HandlerThread๋?
???
by @huewu
- Message๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ Looper๊ฐ ์๋ Thread?
by @suribada ์ง๋ฌธ ์๋: IntentService๋ฅผ ๋ถ์ ํด๋ณด์๋๊ฐ? ๋น์ทํ ๊ธฐ๋ฅ์ ๋ณ๋๋ก ์์ฑํ์ง ์๊ณ ์ง์ ์ฌ์ฉํด๋ดค๋๊ฐ?
๋ต๋ณ: Looper.prepare()์ Looper.loop()๋ฅผ ๋ด๋ถ์ ์ผ๋ก ํธ์ถํ๋ค. ์ค๋ ๋์์ ๋ฉ์์ง ํ ๊ตฌ์กฐ๊ฐ ํ์ํ ๋ ์ฌ์ฉํ ์ ์๋ค. ์ฆ ์ค๋ ๋์์ ์์ฐจ ์์ ์ ์ฌ์ฉํ ์ ์๋ค.
deep sleep ํ์์ ๋ฌด์์ด๊ณ ์ด์ ๋ํ ๋์ฑ ์?
? Doze ๋ชจ๋???
by @suribada ์ง๋ฌธ ์๋: deep sleep ํ์์ ์ดํดํ๊ณ ๋์ฑ ์ด ์๋๊ฐ?
๋ต๋ณ: wakelock๊ณผ ๋๋น๋๋ค. ์์ ์ ์์ด ์ฐ๊ฒฐ๋ ๋ฐ์คํฌํ๊ณผ ๋ฌ๋ฆฌ ๋ชจ๋ฐ์ผ ๋จ๋ง์ ๊บผ์ ธ ์๋ ์ํ๊ฐ ๊ธฐ๋ณธ์ด๊ณ ํ์ํ ๋๋ง ON์์ผ์ ์ฌ์ฉํ๋ค. ํ๋ฉด์ด ๊บผ์ง๋ฉด ๋ช ์ญ์ด ๋ด๋ก sleep ์ํ๋ก ๋ค์ด๊ฐ๋ค. ์ผ๋ฐ์ ์ผ๋ก deep sleep ์ํ๋ผ๊ณ ํํํ๋ค. ํ์์ UI์ ์๊ฐ์ ์๋ฅผ ๋ค์ด 1์ด๋ง๋ค ์ ๋ฐ์ดํธํ๋ค๋ฉด, ํ๋ฉด ๊บผ๋๊ณ ํ์ฐธ ์๋ค๊ฐ ์๊ฐ์ ๋ณด๋ฉด ์ค๋ ์ ์๊ฐ์ ๋ณด์ฌ์ฃผ๋ค๊ฐ ํ์ฌ ์๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค. 1์ด๊ฐ ์๋๋ผ 1๋ถ ๊ฐ๊ฒฉ์ด๋ผ๋ฉด ํ์ฐธ๋์์ ์ด์ ์๊ฐ ๋ณด์ฌ์ฃผ๋ค๊ฐ ๊ฐฑ์ ํ๋ ์ ์ด๋ค. ์ค๊ฐ์ ๊ฐฑ์ ์ ํ์ง ์๋ ์๊ฐ์ด ๋ฐ๋ก deep sleep์ ๋ค์ด๊ฐ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ธ ๋์ฑ ์ ๊ฒฐ๊ตญ wakelock์ ์ก๋ ๊ฒ์ธ๋ฐ, AlarmManager๋ JobScheduler ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ ๋๊ฐ ๋ง๋ค.
Context๋ ์ด๋ค ๋ฐ ์ฐ์ด๊ณ ์์ ํด๋์ค๋ ์ด๋ป๊ฒ ๋๋?
? ์ฃผ๋ก ์ฑ ์ ์ฒด ๋ฆฌ์์ค๋ ์์คํ ๋ฆฌ์์ค์ ์ ๊ทผ, ํ๋ฉด์ด๋ ํน์ ์ํฉ์ ์ ๋ณด์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ค. ActivityContext, ServiceContext, BroadcastContext, ApplicationContext
by @suribada ์ง๋ฌธ ์๋: Context๊ฐ ๋ฌด์์ธ๊ฐ?ํด๋์ค hierarchy๋ ์ด๋ป๊ฒ ๋๋?
๋ต๋ณ: Context๋ก ๋ฆฌ์์ค์ ์ ๊ทผํ๊ณ ์ปดํฌ๋ํธ๋ ์์ํ ์ ์๋ค. Context๋ ์ถ์ ํด๋์ค๋ค. ContextWapper๊ฐ Context๋ฅผ ์์ํ๊ณ Activity, Service, Application์ด ContextWrapper๋ฅผ ์์ํ๋ค. ContextImpl๋ Context๋ฅผ ์์ํ๋๋ฐ, ContextWrapper๋ Wrappingํ ๊ฒ์ด ContextImpl์ด๋ค. ContextImpl์ด ์ฌ๋ฌ ์๊ฒฉ ์๋น์ค์ ๋ํ ๋งคํ์ ์ ์งํ๊ธฐ๋ ํ๊ณ (์์ ์๋ ๋ด๋ถ์ ์ ์งํ๊ณ ์์ฆ์ ๋ณ๋ ํด๋์ค๋ก), ์ค์ ๋์์ ์ฌ๊ธฐ์ ์คํํ๋ค.
Activity์์ this, getBaseContext(), getApplicationContext() ์ฐจ์ด
? Activity ๋ ๋ด๋ถ์ ์ผ๋ก ContextWrapper ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ด๋ ActivityContext ์ด๋ค. ActivityContext ๋ Activity ๊ฐ ์ข ๋ฃ๋๋ฉด ๋์ด์ ๋ฆฌ์์ค ์ ๊ทผ์ด๋ View ์์ฑ๋ฑ์ ์ ์ฝ์ฌํญ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ์ ๊ทผ์ ์ํ ๊ฒฝ์ฐ์๋ ApplicationContext ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ActivityA์์ ActivityB ํธ์ถํ ๊ฒฝ์ฐ ์๋ช ์ฃผ๊ธฐ/ActivityA๋ก ๋ค์ ๋์์ค๋ ๊ฒฝ์ฐ ์๋ช ์ฃผ๊ธฐ
A Pause -> A Stop -> B Create -> B Start -> B Resume -> B Pause -> B Stop -> B Destroy -> A Start -> A Resume
๋จ B ๋์ ์ค A ๊ฐ ๋ฐํ๋์ด re-create ๊ฐ ๋ฐ์ํ๋ค๋ฉด B Stop ํ A Create -> B Destroy ๊ฐ ๋๋ค. (์๋๊ณ ๋ฌป๋๋ค๋ฉด ๋ชจ๋ฆ ๋๋ค. ๋ก๊ทธ ๋ณด๋ฉด ๊ทธ๋ ๋๊ตฐ์...)
(ted)
- ์ ๊ฐ ๋ฉด์ ์์ ๊ผญ ๋ฌผ์ด๋ณด๋ ์ง๋ฌธ(๋ง์ ์ฌ๋๋ค์ด ์ฝ๋ค๊ณ ์๊ฐํ์ง๋ง ์ค์ ๋ก๋ ์๊ฐํ๊ฒ๊ณผ๋ ๋ง์ด ๋ค๋ฅด๊ฒ ์์ง์ด๋ ๋ผ์ดํ์ฌ์ดํด)
startActivity()
๋ฐ์์
[A]onPause
[B]onCreate
[B]onStart
[B]onResume
[A]onStop
- ๋ค๋ก๊ฐ๊ธฐ ๋ฑ์ผ๋ก B๊ฐ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ
[B]onPause
[A]onRestart
[A]onStart
[A]onResume
[B]onStop
[B]onDestroy
onSaveInstanceState() ์คํ ์์
onStop ํ ํธ์ถ
- Activity๊ฐ ์ฌ๋ฌ ์ด์ (Orientation์ด ๋ฐ๋๋ ๊ฒฝ์ฐ, ๋ฐฑ๊ทธ๋ผ์ด๋์ ์๋ค๊ฐ ์ข ๋ฃ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ ๋ฑ)๋ก ์ํ๊ฐ์ ์ ์ฅํด์ผํ๋ ๊ฒฝ์ฐ์ ํธ์ถ๋จ
- ์ ์ฅ๋ ๋๋
onSaveInstanceState()
, ๋ค์ ๋ถ๋ฌ์ฌ๋๋onRestoreInstanceState()
๊ฐ ํธ์ถ๋จ - ํต์์ ์ผ๋ก onCreate()์์ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํจ
- savedInstanceState != null: ์ด์ ์ ์ด๋ ํ ์ด์ ๋ก ์ํ๊ฐ ์ ์ฅ๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก savedInstanceState๋ก๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์ด
- Intent.ACTION_VIEW == intent.action: ๋ฅ๋งํฌ๋ฅผ ํตํด ํ๋ฉด์ด ์์๋์์ผ๋ฏ๋ก getQueryParameter()๋ฅผ ํตํด ๊ฐ์ ๊ฐ์ ธ์ด
- ๊ทธ์ธ: startActivity()๋ฅผ ํตํด ํ๋ฉด์ด ์คํ๋์์ผ๋ฏ๋ก intent๋ก ๋ถํฐ ๊ฐ์ ๊ฐ์ ธ์ด
- savedInstanceState์ฒ๋ฆฌ๊ฐ ์ ๋๋์ง ํ ์คํธํ๋ ๋ฐฉ๋ฒ
- ๊ฐ๋ก/์ธ๋ก orientation์ ๋ฐ๊ฟ๊ฐ๋ฉด์ ํ
์คํธ
- [๊ฐ๋ฐ์ ์ต์
]-[๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค ์ ์ ํ]-[๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค ์์]์ค์
taskAffinity ๋์
- ์คํ์ด๋๋งจ์ ๋์ค๋ MCU์ธ๊ณ๊ด ๋ฉํฐ๋ฒ์ค์ ๋น์ทํ ๊ฐ๋ ์ผ๋ก ์๊ฐํ๋ฉด ํธํจ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ์์ ๋ชจ๋ Activity๋ค์ ๊ฐ์ taskAffinity๋ฅผ ๊ฐ์ง
- Manifest์์ activity์ taskAffinity๋ฅผ ๊ฐ๋ณ๋ก ์ง์ ํด์ค์ ์์
- ์๋ฅผ๋ค์ด A,B Activity๊ฐ ๊ฐ์ taskAffinity๋ฅผ ๊ฐ์ง๋ฉด A๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์๋ค๊ฐ B๊ฐ ์คํ๋๋ฉด A๋ ๊ฐ์ด ์คํ๋์ง๋ง, ๋ค๋ฅธ taskAffinity๋ฅผ ๊ฐ๋๋ค๋ฉด A๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์ธ ์ํ์์ B๊ฐ ์คํ๋๋ A๋ ์ฌ์ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์กด์ฌํจ : ์ผ์ฑ '์ค๋งํธ๋งค๋์ ' ํธ์์๋ฆผ ์ฐจ๋จ์ด์ ๋์ํ๊ธฐ์์ ์ฌ์ฉ๋ taskAffinity ์ฐธ๊ณ
singleTask, singleInstance ์ฐจ์ด
? SingleTask : 1๊ฐ ์กํฐ๋นํฐ๋ง ์๋๋ก ํ๋ค. CLEAR_TASK + NEW_TASK ์ ์ ์ฌ
? SingleInstance : ๋์ผํ ์กํฐ๋นํฐ๋ 1๊ฐ๋ง ์๋๋ก ํ๋ค. BRING_TO_FRONT ์ ์ ์ฌ
Fragment ์ฐ๋ฉด ์ฅ์ , ๋ถํธํ ์
Activity ๊ฐ ๋ฐํ๋์๋ค๊ฐ re-create ๋์์ด ๋ ๋ Fragment ๋ ํจ๊ป ๋ณต๊ตฌ ๋๋๋ฐ ์ด๋ ๊ฐํผ Fragment ๊ฐ onSavedInstance ๊ด๋ จ ๋์ ์ด์ ์ ๋ค๋ฅธ ๋์์ ํ๋ค๊ณ Crash ๋ฅผ ๋ธ๋ค. FragmentTransaction ์์ commit ํ ์ ๊ฐํน ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฅผ ์ํด state loss ๋ฅผ ํ์ฉํ๋ API ๊ฐ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ก๋ค.
Fragment ์ ์ ์์ฑ ๋ฉ์๋๋ฅผ ์ฐ๋ ์ด์
์์ฑ์๋ฅผ override ํด์ ํ ๊ฒฝ์ฐ restore ๋์์ ํน์ ๊ฐ์ด ์ ์ค๋ ์ ์๋ค. ๊ทธ๋์ ์์ฑ์๋ override ํด์๋ ์๋๋ฉฐ Extra ํํ๋ก ๊ฐ์ ์ถ๊ฐํด์ restore ์์์ ํด๋น ๊ฐ์ด ๋ณต์๋ ์ํ์์ ์ฒ๋ฆฌ๋ ์ ์๋๋ก ํด์ผํ๋ค.
- Fragment๊ฐ ์ฌ๋ฌ๊ฐ์ง ์ด์ ์์ ์๋ก ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํธ์ถ๋จ : XXXFragment์ ์์ฑ์์ userId๋ฅผ ๋๊ธฐ๋๋ก ๋ง๋ค์์ด๋ XXXFragment์ ๊ธฐ๋ณธ์์ฑ์๊ฐ ๋ถ๋ฆผ
- ๊ทธ๋ฌ๋ฏ๋ก ์ ์ ๋ฉ์๋๋ฅผ ํ์ฉํด์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค๊ณ bundle์ argument๋ฅผ ๋๊ธฐ๋ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ผํจ
- ํต์์ ์ผ๋ก ์ ์ ๋ฉ์๋ ์ด๋ฆ์
newInstance()
๋ก ๋ง๋ค์ด์ ์ฌ์ฉํจ
์๋น์ค๋ ์ธ์ ์ฌ์ฉ?
๊ธฐ๋ณธ ์ฉ๋๋ ๋ฐฑ๊ทธ์ด๋ ๋์์ ์ํด ์ฐ์ฌ์ง๋ฉฐ ๋จ๋ฐ์ฑ์ธ ๊ฒฝ์ฐ IntentService ๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค. ๋ด๋ถ์์ Queue ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ Download ์ฒ๋ฆฌ๋ ํน์ ํ๋ก์ธ์ฑ ๋ฑ์ ์ํ ์ฒ๋ฆฌ๋ก ์ด์ฉํ ์ ์๋ค. ์ฅ์๊ฐ ๋จธ๋ฌด๋ฅด๋ฉฐ ๋์ํด์ผํ๋ ๊ฒฝ์ฐ Service ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ฃผ๋ก TCP ์ฐ๊ฒฐ ํ ์๋ฒ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ง์ด ์ฌ์ฉํ์๋ค.
์์คํ ์๋น์ค์ ์๋น์ค ์ปดํฌ๋ํธ ์ฐจ์ด์
???
Service onStartCommand ๋ฆฌํด ๊ฐ ๊ตฌ๋ถ
? ๋ฐํ์ ์๋์ฌ์คํ, ๋ฐํ์ ๋ ์ด ์๋ค.
- ์ด๋ค ๊ฐ์ returnํ๋๋์ ๋ฐ๋ผ์ ์๋น์ค๊ฐ ๋์ค์ ์ฌ์์๋ ๋ intent๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ํ ์ ์์
START_STICKY
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ฐ์
- ์๋น์ค๊ฐ ์ข ๋ฃ๋๊ณ ๋์ ์์๋ ๋ intent๋ null๋ก ๋ด๋ ค์ด : ๋๋ถ๋ถ ์ฌ๊ธฐ์ intent null์ฒ๋ฆฌ๋ฅผ ํ์ง ์์์ ์ฃฝ๋๊ฒฝ์ฐ๊ฐ ๋ฐ์ํจ
START_NOT_STICKY
- ์๋น์ค๊ฐ ์ฃฝ์ด๋ ๋ค์ ์์๋์ง ์์
- ์ฃผ๋ก batch์์ ๊ฐ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํ๊ฑฐ๋ ์์ ์ด ๋๋๋ฐ ์๋น์ค๊ฐ ์ฃฝ์ด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ
START_REDELIVER_INTENT
- ์๋น์ค๊ฐ ๋ค์ ์์๋ ๋ ์ด์ ์ ์ ๋ฌ๋ฐ์๋ intent๋ฅผ ๋ค์ ๊ฐ์ ธ์ด
- ์๋น์ค๊ฐ ์ค๊ฐ์ ๋ฉ์ถ๋๋ผ๋ ์ฒ์์ ์คํํ๋ ์์ ์ ๋ฌด์กฐ๊ฑด ๋ค์ ์์ํด์ ์๋ฃํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
Started & Bound Service ์ธ์ ์ฐ์ด๋?
? Bound Service ํน์ ServiceBinder ๊ฐ ์ฐ๊ฒฐ์ ์์ฒญํ ๊ฒฝ์ฐ ์ฐ๊ฒฐ๋๋ฉฐ Binder ๊ฐ ์ข ๋ฃ๋๋ฉด Service ๋ ํจ๊ป ์ข ๋ฃ๋๋ค. ์๋น์ค์์ ํน์ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒฝ์ฐ ์ง์ ํต์ ์ ํ๊ณ ์ถ์๋ ์ด๋ค.
BIND_AUTO_CREATE ์ต์ ์ ์ ์ฐ๋?
? Binder ์์ฒญ์ ์๋น์ค๊ฐ ์๋์ผ๋ก ์คํํ๋๋ก ํ๊ธฐ ์ํด??
IntentService
1๋ฒ์ 1๊ฐ์ ๋์์ ๋ชฉ์ ์ผ๋ก ํ๋ฉฐ ๋ด๋ถ์์ Service ๊ฐ Queue ๋ฅผ ๊ด๋ฆฌํ์ฌ ๋์ํ๋ค.
aidl ์คํ ๊ณผ ํ๋ฝ์
? ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก ์ ์ธ๋ ์๋น์ค์ ์ง์ ํต์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
์๋น์ค์ Activity ํต์ ๋ฐฉ๋ฒ์ ์ด๋ค ๊ฒ๋ค์ด?
? Binder, ๋์ผํ ํ๋ก์ธ์ค๋ผ๋ฉด Application level Singleton, ContentProvider, Sqlite ๋ฅผ ํ์ฉํ MessageQueue ๊ตฌํ ํ polling ์ฒ๋ฆฌ
cp์ ์ง์ db ์ ๊ทผ ์ฝ๋ ์ ํ ๊ธฐ์ค
ContentProvider : ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ธํฐํ์ด์ค๋ฅผ ๊ณต์ ํ์ง ์๋ ๋ชจ๋๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํด์ผํ ๋
DB : ๊ฐ์ ์ฑ - ํด๋น DB ๋ฅผ ์ ๊ทผํ ์ ์๋ ๋์ผํ ๋ ๋ฒจ์ ๋ชจ๋/ํ๋ก์ธ์ค๊ฐ, ๋ค๋ฅธ ์ฑ - DB ํ์ผ์ ์์น๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ ์๋ ๊ฒฝ์ฐ
db lock์ด๋?
๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋์ผํ DB/ํ ์ด๋ธ์ ์ ๊ทผํ๋ค๋ฉด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง ์ ์๋ค. ์ด๋ฅผ ์ํด 1๋ฒ์ 1๊ฐ์ ๋ ์ฝ๋์ ์ ๊ทผํ ์ ์๋๋ก ํด์ผํ๋ค.
db transaction์ ์ฅ์ ๊ณผ ๋ฌธ์
? db ์ฒ๋ฆฌ์ค ์๋ฌ ๋ฐ์์ ์์ฒด rollback ๊ฐ๋ฅํ๋ commit ๋ช ๋ น์ด ํธ์ถ๋๋ ์๊ฐ ๋ค๋ฅธ ์ ๊ทผ์๋ ๋๊ธฐ ์ํ๊ฐ ๋๋ฉฐ commit ์ด์ ์๋ ๋ณ๊ฒฝ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ผ๋ณผ ์ ์๋ค.
BroadcastReceiver์์ Toast๋ฅผ ๋์ฐ๋ฉด?
Crash. BroadcastReceiver ๋ UI Thread ์์ ๋์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ช ์์ ์ผ๋ก Handler ๋ฅผ ํตํด Toast ๋ฅผ ํธ์ถํด์ผํ๋ค.
์ง๋ฌธ ์๋: ํ๋ก์ธ์ค ์ฐ์ ์์๋ฅผ ์ดํดํ๊ณ ์๋๊ฐ์ด๋ค. ํ ์คํธ๋ฅผ ํด๋ณด์ง ์์ผ๋ฉด ์๊ธฐ ์ด๋ ต๋ค. Yes๋ผ๊ณ ํด๋ ์ ๋๊ณ No๋ผ๊ณ ํด๋ ์ ๋๋ค.
๋ต๋ณ: Toast๋ ๋ฐ ๋๋ ์๊ณ ์ ๋ฐ ๋๋ ์๋ค. BroadcastReceiver์ onReceive() ๋ฉ์๋ ์์ฒด๋ UI ์ค๋ ๋์์ ๋์ํ๋ค. ๊ทธ๋์ Toast๊ฐ ์ ๋ฐ ๊ฑฐ ๊ฐ์๋ฐ, ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. ์ฑ์ ์คํ์ค์ธ ์ปดํฌ๋ํธ ์๋ฅผ ๋ค์ด Activity๊ฐ ํฌ๊ทธ๋ผ์ด๋์ ๋ ์๊ฑฐ๋ ํ๋ฉด ํ๋ก์ธ์ค ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ BroadcastReceiver์์ Toast๋ ์ ๋ฌ๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์คํ์ค์ธ๊ฒ ์์ด ์ด๋์ ๊ฐ ๋ธ๋ก๋์บ์คํธ๋ฅผ ํด์ BroacastReceiver๋ง ๋ฌ๋ ์คํ๋ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. Toast ์์ฒด๋ ๋น๋๊ธฐ ๋์์ด๊ธฐ ๋๋ฌธ์ BroadcastReceiver์ onReceive() ์คํ์ค์๋ ์ฐ์ ์์๊ฐ ๋์ง๋ง ๋๋์๋ง์ ํ๋ก์ธ์ค ์ฐ์ ์์๊ฐ ๋จ์ด์ ธ์ ํ๋ก์ธ์ค๋ ์ข ๋ฃ๋ ์ ์๋ค. ์ด๋๋ Toast๊ฐ ๋จ์ง ๋ชปํ๋ค.
LocalBroadcastManager ์ญํ
? AndroidManifest ์ ์ ์ธํ์ง ์์ ์ฑ๋ด์์ registerReceiver ๋ก ๋ฑ๋ก๋ ๋ฆฌ์๋ฒ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ค.
Application์ ์ฉ๋
์ฑ ์ต์ด ์คํ์ ํ์ํ ์ฒ๋ฆฌ ์ด๊ธฐํ. MultiDex ์ด๊ธฐํ.
- ์ฑ์ด ์คํ๋๊ณ ์๋ํ ๋ฌด์กฐ๊ฑด ์กด์ฌํ๋ค๊ณ ํ๋จํ ์ ์๋ ํด๋์ค
- ๋๋ถ๋ถ singletonํํ๋ก Applicationํด๋์ค๋ฅผ ํ์ฉํจ
- context๊ฐ ํ์ํ๊ฒฝ์ฐ Application์ ํด๋์ค๋ฅผ ํ์ฉํด์ ์ฌ์ฉํจ : UI๊ฐ ํ์ํ context์ธ ๊ฒฝ์ฐ๋ Application์ context๋ฅผ ์ฌ์ฉํ๋ฉด ์๋จ
- ์ฌ๋ฌ ํ๋ฉด์์ ํ์ํ ๋ณ์๋ ๊ฐ์ static๋ณ์๋ก ์ ์ธํด์ ์ฌ์ฉํ์ง ์๊ณ Application์ ํ๋๋ก ์ ์ธํด์ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๊ฒ ํ๋ ํจํด๋ ์์ : ํ์ง๋ง ๋๋ฌด ๋จ์ฉํ๋ฉด ์๋๋ฏ๋ก ์ถ์ฒํ์ง๋ ์์. repositoryํจํด์ ์ฌ์ฉํ๊ฑฐ๋ intent๋ฑ์ ๋ค๋ฅธ ์ฐํ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋๋ก ํด์ผํจ
SharedPreferences commit()๊ณผ apply() ์ฐจ์ด
Commit : ๋๊ธฐ์, Apply : ๋น๋๊ธฐ์.
? SharedPreference ๋ ํ์ผ์ ํ๋ฒ ์ฝ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ๊ด๋ฆฌํ์๋ค๊ฐ ํ์ผ์ ๋ค์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค. Commit ์ ํ์ผ์ ๊น์ง ๊ธฐ๋ก์.. Apply ๋ ๋ฉ๋ชจ๋ฆฌ์๋ง ๊ฐฑ์ ํ๊ณ ํ์ผ์๋ ์ด๋ ์์ ์ bulk ๋ก...
google play service ์ฐ๊ฒฐ์ ์ด๋ป๊ฒ ํ๋๊ฐ? ๋ด๋ถ ๊ตฌ์กฐ
???
Parcelable/Serializable ์ฐจ์ด
??? Parcel ์ Android ์ ํ์ํ ๋ช๊ฐ์ง ์ฒ๋ฆฌ๊ฐ ๋ ๋์ด ์๋ค๊ณ ํ๋ค. ๋ํ Intent ์ ๋ด์์ ์ ๋ฌํ ๋ Serializable ๋ณด๋ค ๋ ๊ฐ๋ณ๋ค๊ณ ํ๋ค.
- Serializable์ Java์์, Parcelable์ ์๋๋ก์ด๋์์ ์ถ๊ฐ๋ ๊ฐ๋
- Serializable๋ก ๋ง๋๋๊ฑด Serializable์ implements๋ง ํด์ฃผ๋ ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด ๋์ ์์ฒญ ๊ฐ๋จํ์ง๋ง refelection์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฑฐ์
- Parcelable๋ก ๋ง๋๋ ค๋ฉด ๊ท์ฐฎ์ ์์ ์ ํด์ฃผ์ด์ผ ํ์ง๋ง ์๋๋ก์ด๋ ์คํ๋์ค์ ํ๋ฌ๊ทธ์ธ์์ ์ฝ๋๋ฅผ ์์์ ๋ง๋ค์ด ์ฃผ๋๊ฒ ์์ด์ ํธํจ : kotlin์ ์ฌ์ฉํ๋ค๋ฉด @Parcelize ๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด์ ์์ฒญ ๊ฐ๋จํ๊ฒ Parcelable์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์๋๋ก์ด๋ ๋ชจ๋ Parcelable, Serializable๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง Parcelable์ ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ
- ๊ฐ์ธ์ ์ผ๋ก ์๋๋ก์ด๋์์ Parcelable์์ฐ๊ณ Serializable์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๊ทนํ
๋ฉ๋ชจ๋ฆฌ๋ฆญ ํ์ธํ๋ ๋ฐฉ๋ฒ
Leak Canary, Profiler, dumpsys
targetSdkVersion ์ฉ๋
์ฑ์ ํน์ sdk api ์ ๋ง์ถฐ์ ๋น๋ํ๋ค.
์ง๋ฌธ ์๋: compileSdkVersion, minSdkVersion๊ณผ ๊ตฌ๋ถ์ ํ๋๊ฐ?
๋ต๋ณ: ๊ทธ ๋ฒ์ ๊น์ง๋ ํธํ์ฑ ๋ชจ๋๋ฅผ ์ฐ์ง ์๊ฒ ๋ค๋ ์๋ฏธ๋ค. ํธํ์ฑ ๋ชจ๋๋ ์๋๋ก์ด๋ ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋๋ผ๋ ์ฑ์ ๊ธฐ์กด ๋์์ด ๋ฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด AsyncTask ๋ณ๋ ฌ ์คํ์ด์๋ค๊ฐ ์์ฐจ ์คํ์ผ๋ก ๋ฐ๋์๋๋ฐ, targetSdkVersion๋ฅผ ์ฌ๋ฆฌ์ง ์์ผ๋ฉด ๊ธฐ์กด๊ณผ ๋์ผํ๋ค.
์ฑ๊ธํค์ Context๊ฐ ๊ทธ๋๋ก ์ ๋ฌ๋๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธฐ๋๊ฐ? (์ฝ๋๋ก ๋ง๋ค๊ธฐ)
??? ApplicationContext ๋ฉด ok. ๊ทธ์ธ์ Context ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฆญ.
Singleton.context = context.getApplicationContext() ๋ก ํด์ค์ผ ํจ.
์๋ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋?
for (int i = 0; i < 4; i++) {
title.setText("current=" + i);
SystemClock.sleep(1000);
}
??? ์๋ง๋ ํ๋ฉด์ด 1์ด์ฉ ๋๊ธฐ๋ฉฐ ์ ๋ฐ์ดํธ?
์ง๋ฌธ ์๋: ๋ฌธ์ ์๋ ์ฝ๋๋ผ๋ ๊ฑธ ์๊ณ ์๋๊ฐ? UI์์ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก UI๋ฅผ ์ ๋ฐ์ดํธ๋ ํจํด์ ์๊ณ ์๋๊ฐ?
Runnable updateRunnable = () -> {
current++;
title.setText("current=" + current);
if (current < 4) {
handler.postDelayed(this, 1000);
}
}
public void onClick(View v) {
handler.post(updateRunnable);
}
๋ต๋ณ: ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ธ๋กํน ํ๊ธฐ ๋๋ฌธ์ 1์ด๋ง๋ค ์ถ๋ ฅ์ด ๋์ง ์๋๋ค. 5์ดํ์ current=4๋ง ์ถ๋ ฅ๋๋ค. setText()๋ ๊ฒฐ๊ตญ invalidate() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ MessageQueue์ ๋ค์ ๊ทธ๋ฆฌ๋๋ก ๋ช ๋ นํ๋๋ฐ, ๊ทธ๋ ๋ค๋ฉด MessageQueue์ 5๋ฒ์ invalidate() ๋ฉ์๋ ํธ์ถ๋ก, ๋์ ๋ณด์ด์ง ์๋ ์์๊ฐ์ current=0, current=1, ..., current=3๊น์ง ํ๊ณ ์ ์ต์ข current=4๊น์ง ๋๋ ๊ฒ์ ์๋๊น ์๊ฐํ ์๋ ์๋๋ฐ, invalidate() ๋ด์์ ํ๋๊ทธ๊ฐ ์์ด์ ํ๋ฒ๋ง ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํ๋ค.
======= ์ผ๋ฐ =====
State ํจํด๊ณผ Strategy ํจํด ์ฐจ์ด
๋ง์ปค ์ธํฐํ์ด์ค
? IntRes, Nullable, VisibleForTesting ์ด๋ฐ๊ฑฐ?
์ ๋ํ ์ด์ ํ์ฉ์?
ํน์ ๋ณ์๋ ํจ์, ํด๋์ค ๋ฑ์ ๋ํ ๋ช ์์ ์ผ๋ก ์ถ๊ฐ์ ๋ณด ์ ๋ ฅ. APT (Dagger), Proxy (Retrofit), Lint (SupressWarning, VisibleForTesting) ๋ฑ๋ฑ
AOP ์ฅ๋จ์ ?
์ฅ์ : ๊ณตํต์ ์ธ ์ ์ฒ๋ฆฌ, ํ์ฒ๋ฆฌ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ํธํ๋ค.
๋จ์ : ์ค์ ์ด ๋นก์ธ๋ค. ๋ชจ๋ ์ฒ๋ฆฌ์ ๊ณตํต ๋์์ด ์ถ๊ฐ ๋๊ธฐ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํฅ์ ์ค๋ค.
์ค๋ ๋ํ AbortPolicy
???
CountDownLatch ์ฌ์ฉ. ์ฃผ์ํ ์
? ์นด์ดํธ๊ฐ 0 ์ด ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๋ก ํ๋ค. ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์นด์ดํธ ๋ค์ด์ ์คํํ๊ณ wait ํ๋ ์ฐ๋ ๋๋ 0 ์ด ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. 0 ์ด ๋๋ฉด ์ฌ์ฌ์ฉ ์๋๋ ์ฃผ์.
enum์ ์ด๋ค ๋ ์ฐ๋๊ฐ?
? ํน์ ์ํ๋ฅผ Primitive ํ์ ์ด ์๋ ๋ช ์์ ์ผ๋ก ์ ์ธํ๊ณ ์ ํ ๋
for each ๋ด๋ถ ๊ตฌ์กฐ๋?
Array/Collection -> iterator ๋ก ๋ณํ๋๋ค. ๋ฐ๋ผ์ for-each ๋์ค ๋ฐ์ดํฐ์ size ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ฌ๊ฐ ๋๋ค.
๋ค์ด๋๋ฏน ํ๋ก์๋?
ํน์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๊ณ Proxy ๋ฅผ ์ฌ์ฉํ์ฌ Method Invoker ๋ฅผ ํตํด์ ์ฌ์ ์ ์๋ ๋์์ ํ๋๋ก ํ๋ค. ๋ํ์ ์ธ ์ : Retrofit
======== RxJava ===
Subject ๋ฌธ์ ์ ๊ณผ ์ด๋ ๋ ์ฌ์ฉํ๋ฉด ๋๋๊ฐ?
์ธ๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผํ ๊ฒฝ์ฐ Subject ๋ HotObservable ์ด๊ธฐ ๋๋ฌธ์ downstream ์ ์ฒ๋ฆฌ ์ฉ๋์ ๋ํด์ ๊ด์ฌํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ๋ฐ์ด์ค๋ค. ๋ฐ๋ผ์ BackPressure ์ด์๊ฐ ๋๋ฐ๋๋ค.
Scheduler์ Worker์ ๊ด๊ณ
??? Scheduler ๋ ํน์ ์ฐ๋ ๋๋ฅผ ๋ช ์ํ๋ ๊ฒ์ด๋ฉฐ Worker ๋ ์ฐ๋ ๋์์ ์ค์ ๋์์ ์ํํ๋ฉฐ ์ฒ๋ฆฌ, ๋๋ ์ด, dispose ๋ฑ ์ง์ ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
subscribeOn/observerOn ์ฐจ์ด
subscribeOn ๋ ํด๋น ์คํธ๋ฆผ์ ์์ ์คํธ๋ฆผ์ด ์์ฑ๋๋ ์์ ์ ์ฐ๋ ๋๋ฅผ ์ ์ธํ๋ค. observeOn ๋ ๋ฐ์ดํฐ๊ฐ ๋ณด๋ด์ง ๋ค์ downstream ์ด ๋์ํ ์ฐ๋ ๋๋ฅผ ์ ์ธํ๋ค.
- ํต์์ ์ผ๋ก
subscribeOn()
,observerOn()
๋ฅผ ํ์์ผ๋ก ๊ฐ์ด ์ฌ์ฉํ๋๋ฐsubscribeOn()
๋ ๊ทธ ์ง์ ํ ๋์ ์ฐ๋ ๋,observerOn()
๋ ๊ทธ ์ง์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ๋์ ์ฐ๋ ๋์ ๋๋ก ์๊ฐํ ์ ์๋ค. - Rx์์
flatMap()
,filter()
๋ฑ์ ์ฌ๋ฌ operator๋ฅผ ํ์ฉํด์ chaining์ ํ ๋observerOn()
์ ์ ํ์ฉํด์ ์ฐ๋ ๋๋ฅผ ์ ํ์์ผ์ ํด๋น ์์ ์ ๋ง๋ ์ ์ ํ ์ฐ๋ ๋ ์์ ์ ์์ผ์ฃผ๋๋ก ํ ์ ์๋ค.