https://goni95.tistory.com/173
1๏ธโฃANR
์ ํ๋ฆฌ์ผ์ด์ ์ Main Thread๊ฐ ์ผ์ ์๊ฐ ์ด์ ์ฐจ๋จ๋์ด ์ฌ์ฉ์์ ์ํธ์์ฉ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์๋๋ก์ด๋ ์์คํ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ ์ข ๋ฃ ํ๊ธฐ์ํด ๋ฐ์์ํค๋ Dialog ์ ๋๋ค.
ANR Dialog๊ฐ ๋ฐ์๋๋ ์กฐ๊ฑด์ ์๋์ ๊ฐ์ต๋๋ค.
- ์ฌ์ฉ์์ ์ ๋ ฅ ์ด๋ฒคํธ(ํฐ์น)์ 5์ด ๋ด์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ
- ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ๊ฐ 10์ด ๋ด์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ
- ์๋น์ค๊ฐ 20์ด ์ด์ Main Thread๋ฅผ ์ด์ฉํด ์์ ํ ๊ฒฝ์ฐ
Main Thrad๊ฐ ์ฐจ๋จ๋๋ฉด ๋ฐ์ํ๋ค๋ ๋ง ๊ทธ๋๋ก UI๊ฐ ์๋ ๋ธ๋ก๋์บ์คํธ ๋ฆฌ์๋ฒ, ์๋น์ค๋ Main Thread๊ฐ ์คํ์ ์ฃผ์ฒด์ธ ๊ฒฝ์ฐ์ ANR์ด ๋ฐ์ํ ์ ์๋ค๋ ๋ป ์ ๋๋ค.
์ด ANR ๋ฐ์์ ํํผํ๊ธฐ ์ํด์ ๊ธด ์๊ฐ์ ์์ํ๋ ์์ ์ Main Thrad๊ฐ ์๋ Sub Thread์์ ๋์ํ๋๋ก ๊ตฌํํด Main Thread์ ํ๋ถ๋ฅผ ์ค์ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
- Sub Thread์์ ๊ธด ์๊ฐ์ ์์ํ๋ ์์ ์ ์ํํ๊ณ Handler๋ฅผ ์ด์ฉํด ์์ ์ํ ๋ฉ์์ง๋ฅผ Main Thread์ ์ ๋ฌ
- ๊ธด ์๊ฐ์ ์์ํ๋ ์์ ์ RxJava, Coroutine๋ฅผ ํตํด Sub Thread์์ ์์
2๏ธโฃIntent
Android ๋ฐํ์์์ ์ปดํฌ๋ํธ ๊ฐ ํต์ ์ ํ๊ธฐ์ํด ์ฌ์ฉ๋๋ ๋ฉ์์ง ๊ฐ์ฒด ์ ๋๋ค.
์ธํ ํธ๋ ๋ช ์์ ์ธํ ํธ์ ์์์ ์ธํ ํธ๋ก ๋๋ฉ๋๋ค.
๋ช ์์ ์ธํ ํธ๋ ์ปดํฌ๋ํธ ์ด๋ฆ์ ์ฌ์ฉํ๋ ํํ๋ก, ๋ณดํต ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ์คํํ ๋ ์ฌ์ฉํฉ๋๋ค.
์์์ ์ธํ ํธ๋ ์ปดํฌ๋ํธ ์ด๋ฆ์ ์ ํ์๋ ์์ง๋ง ์ด๋ค ์์ ์ ์ํํ ๊ฒ์ธ์ง์ ์ ์ธํ๋ ํํ๋ก, ํด๋น ์ธํ ํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ์์คํ ์ด ํํฐ๋งํด ์ํํ๊ฑฐ๋ ์ฌ์ฉ์์๊ฒ ์ ํํ๋๋ก ํฉ๋๋ค.
์ปดํฌ๋ํธ์ ๋ํ Intent Filter๊ฐ ์ ์ธ๋์ง ์์ ๊ฒฝ์ฐ ํด๋น ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ์ฑ์ ์ํด ์์๋ ์ ์๊ณ , ๋ณด์์ ์ํด ์๋น์ค๋ฅผ ์์์ ์ธํ ํธ๋ฅผ ์ด์ฉํด ํธ์ถํ์ง ์๋ ๊ฒ์ด ์ข๋ค๊ณ ํฉ๋๋ค.
์์์ ์ธํ ํธ๋ฅผ ์์ธํ ์ค๋ช ํ์๋ฉด Intent๋ฅผ ์คํํ๋ฉด Android System์ ์ ๋ฌ๋๊ณ Android System์ด ๊ธฐ๊ธฐ์ ์ค์น๋ ๋ชจ๋ ์ฑ์์ ํด๋น Intent์ ์ผ์นํ๋ AndroidMenifest.xml์ ์ ์ธ๋ Intent Filter๋ฅผ ๊ฒ์ํ์ฌ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ์ ํด๋น ์ฑ์ ์ปดํฌ๋ํธ์ Intent๋ฅผ ์ ๋ฌํด ์คํํฉ๋๋ค.
๋ง์ฝ ์ผ์นํ๋ Intent Filter๊ฐ ์ฌ๋ฌ ์ฑ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ Android System์์ ๋ํ์์๋ฅผ ํตํด ์ ํํ ์ ์๊ฒ ํฉ๋๋ค.
์ธํ ํธ ํํฐ๋ ์๋๋ก์ด๋ ์์คํ ์ ์ ๊ณตํ๋ ์ ๋ณด๋ก A ์ฑ์์ B ์ฑ์ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ ์ ์๋๋ก ํ์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
<activity android:name=".SubActivity3">
<intent-filter>
<action android:name="implicit.intent.action.SENDTO" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<activity android:name=".SubActivity2">
<intent-filter>
<action android:name="implicit.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".SubActivity">
<intent-filter>
<action android:name="implicit.intent.action.CALL" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<action> : ํ์ฌ ์กํฐ๋นํฐ๊ฐ ์ด๋ค ์ธํ ํธ ์์ฒญ์ ๋์ํ๋๋ก ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
<action android:name="android.intent.action.MAIN" /> | ์ฒ์์ผ๋ก ์คํ๋๋ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.intent.action.VIEW" /> | URL ๋ก ํธ์ถ๋๋ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.intent.action.DEFAULT" /> | action.VIEW ์ ๋์ผ |
<action android:name="android.intent.action.EDIT" /> | ์์ ์ ์ํ ํ๊ธฐ ์ํ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.intent.action.DELETE" /> | ์ญ์ ๋ฅผ ์ํ ํ๊ธฐ ์ํ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.intent.action.DIAL" /> | ์ ํ๊ฑธ๊ธฐ๋ฅผ ์ํ ํ๊ธฐ ์ํ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.intent.action.CALL" /> | ์ ํ๊ฑธ๊ธฐ๋ฅผ ์ํ ํ๊ธฐ ์ํ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.intent.action.SENDTO" /> | ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ํ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.intent.action.ANSWER" /> | ์ ํ ์ฐฉ์ ์ ํ๊ธฐ ์ํ ์กํฐ๋นํฐ๋ก ์ค์ |
<action android:name="android.nfc.action.WEB_SEARCH"/> | ์น ๊ฒ์์ ์ํํ๊ธฐ ์ํ ์กํฐ๋นํฐ๋ก ์ค์ |
<category> : ์กํฐ๋นํฐ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ก, ์กํฐ๋นํฐ์ ๋ฒ์ฃผ๋ฅผ ์๋ฏธํฉ๋๋ค.
<category android:name="android.intent.category.LAUNCHER"/> | ์ฌ์ฉ์ ์ฑ์ ์ค์น๋ ๋ชฉ๋ก์ ๋ณด์ฌ์ง๊ฒํ๋ค |
<category android:name="android.intent.category.DEFAULT"/> |
์์์ ์ธํ ํธ๋ฅผ ๋ฐ์ ์ ์๊ฒ ํ๋ค |
<category android:name="android.intent.category.BROWSABLE"/> | ์น๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ ํฌํจํ๋ค, ๋งํฌ๋ก ์ฐ๊ฒฐ๋ ์ฝํ ์ธ (์ด๋ฏธ์ง, ์น๋ฌธ์, ์ด๋ฉ์ผ ๋ฉ์์ง ๋ฑ)๋ฅผ ๋ณด์ฌ์ค ์ ์๊ฒํ๋ค |
<data> : ์กํฐ๋นํฐ๋ฅผ ์คํํ๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ณด๋ฅผ ์๋ฏธํฉ๋๋ค. data๋ URL ํ์์ผ๋ก ํํ๋๊ณ , scheme, host, port, mimeType ๋ฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ์ธํฉ๋๋ค.
<data android:mimeType="text/*"/> | text/plane text/html text/css text/javascript text/* |
ํ ์คํธ๋ฅผ ํฌํจํ๋ ๋ชจ๋ ๋ฌธ์ |
<data android:mimeType="image/*"/> | image/gif image/png image/jpeg image/bmp image/webp image/* |
๋ชจ๋ ์ข ๋ฅ์ ์ด๋ฏธ์ง |
<data android:mimeType="video/*"/> | video/webm video/ogg video/* |
๋ชจ๋ ์ข ๋ฅ์ ๋น๋์ค ํ์ผ |
3๏ธโฃํ๋ฉด ๋ชจ๋ ์ ํ, ๊ฐ์ ์ข ๋ฃ ์ ์ํ ๋ฐ ๋ฐ์ดํฐ ์ ์ง
ํ๋ฉด ๋ชจ๋ ์ ํ๊ณผ ์์คํ ์ ์ํ ๊ฐ์ ์ข ๋ฃ ์ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ onSaveInstanceState() ๋ฉ์๋๋ฅผ ํ์ฉํ๋ ๊ฒ ์ ๋๋ค.
onSaveInstanceState() ๋ฉ์๋๋ ์กํฐ๋นํฐ์ ํ๋๊ทธ๋จผํธ ๋ชจ๋ onPause()์ onStop() ๋ฉ์๋ ์ฌ์ด์์ ํธ์ถ๋๊ณ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ Bundle์ key ๊ฐ์ผ๋ก data๋ฅผ ๊ตฌ๋ถํด ์ ์ฅํ ์ ์์ต๋๋ค.
์กํฐ๋นํฐ์์ ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ onCreate() ๋๋ onRestoreInstanceState() ๋ฉ์๋๋ฅผ ํตํด Bundle์ ๊ฐ ์ ๋ฌด์ ๋ฐ๋ผ ๋ถ๊ธฐ์ฒ๋ฆฌํด key ๊ฐ์ผ๋ก data๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๋ฉ๋๋ค.
ํ๋๊ทธ๋จผํธ์์ ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ onCreate(), onCreateView(), onViewCreated(), onViewStateRestored() ๋ฉ์๋๋ฅผ ํตํด Bundle์ ๊ฐ ์ ๋ฌด์ ๋ฐ๋ผ ๋ถ๊ธฐ์ฒ๋ฆฌํด key ๊ฐ์ผ๋ก data๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๋ฉ๋๋ค.
์ํ๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ๋ค์ํ ์๋ฅผ ์๋ ํ๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
์ํ ์ ์ง | savedInstanceState | SavedStateHandle | ViewModel |
์ ์ฅ์ ์์น | ๋ฉ๋ชจ๋ฆฌ | ๋์คํฌ | ๋์คํฌ |
ํ๋ฉด ๋ชจ๋ ์ ํ | ์ | ์ | ์ |
์์คํ ์ ์ํ ๊ฐ์ ์ข ๋ฃ | ์ | ์ | ์๋์ |
์ฌ์ฉ์๊ฐ ์ฑ์ ์ข ๋ฃ | ์๋์ | ์๋์ | ์๋์ |
๋ฐ์ดํฐ ์ ์ง | cache | File | Room ๋๋ DB |
์ ์ฅ์ ์์น | ๋์คํฌ์ ๊ฒฝ์ฐ | ๋ด๋ถ / ์ธ๋ถ ํ์ผ | ๋์คํฌ / ๋คํธ์ํฌ |
ํ๋ฉด ๋ชจ๋ ์ ํ | ์ | ์ | ์ |
์์คํ ์ ์ํ ๊ฐ์ ์ข ๋ฃ | ์ | ์ | ์ |
์ฌ์ฉ์๊ฐ ์ฑ์ ์ข ๋ฃ | ์ | ์ | ์ |
Bundle : ์ฌ๋ฌ๊ฐ์ง ํ์ ์ ๊ฐ์ ์ ์ฅํ๋ Map ํด๋์ค