๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Android/Android์˜ ๋ชจ๋“  ๊ฒƒ

๐Ÿ‘‹Android์˜ ๋ชจ๋“  ๊ฒƒ : 1๏ธโƒฃANR, 2๏ธโƒฃIntent, 3๏ธโƒฃํ™”๋ฉด ๋ชจ๋“œ ์ „ํ™˜, ๊ฐ•์ œ ์ข…๋ฃŒ ์‹œ ์ƒํƒœ ๋ฐ ๋ฐ์ดํ„ฐ ์œ ์ง€

728x90

https://goni95.tistory.com/173

 

๐Ÿ‘‹Android์— ๋ชจ๋“  ๊ฒƒ ๊ฐœ๋…

๋ชฉ  ์ฐจ ๐Ÿ‘‹Android์— ๋ชจ๋“  ๊ฒƒ : 1๏ธโƒฃAndroid, 2๏ธโƒฃAndroid SDK, 3๏ธโƒฃPlatform Architecture ๐Ÿ‘‹Android์— ๋ชจ๋“  ๊ฒƒ ๊ฐœ๋… : 1๏ธโƒฃApp Manifest, 2๏ธโƒฃAndroid Context, 3๏ธโƒฃApp Components ๐Ÿ‘‹Android์—..

goni95.tistory.com

 

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 ํด๋ž˜์Šค