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

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

๐Ÿ‘‹Android์˜ ๋ชจ๋“  ๊ฒƒ : 1๏ธโƒฃApp Manifest, 2๏ธโƒฃContext

728x90

https://goni95.tistory.com/173

 

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

Android ๋ชฉ  ์ฐจ Android Android SDK Platform Architecture App Manifest Android Context App Components Activity์™€ Fragment ์ƒ๋ช…์ฃผ๊ธฐ Activity์™€ Fragment ์ฐจ์ด LayoutInflater ANR View ๋ฐ ViewGroup ํ™”๋ฉด..

goni95.tistory.com

 

1๏ธโƒฃ App Manifest

์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „ ํ™•๋ณดํ•ด์•ผํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ํ•„์ˆ˜ ์ •๋ณด๊ฐ€ ๊ธฐ์ˆ ๋œ ๋ช…์„ธ์„œ ์ž…๋‹ˆ๋‹ค.

๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์—๋Š” ์•ฑ์˜ ํŒจํ‚ค์ง€ ๋ช…, ์•ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ, ์•ฑ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ถŒํ•œ, ์•ฑ์—์„œ ์š”๊ตฌํ•˜๋Š” ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ํŠน์ง• ๋“ฑ์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๊ตฌ์กฐ

<manifest> : ํŒจํ‚ค์ง€
    <uses-permission> : ๊ถŒํ•œ
    <application> : ์ปดํฌ๋„ŒํŠธ
    <uses-feature> : ๊ธฐ๊ธฐ ํ˜ธํ™˜์„ฑ

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ํŒจํ‚ค์ง€ ๋ช…">
    //1. package : "๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํŒจํ‚ค์ง€ ๋ช…์„ ์‚ฌ์šฉํ•ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์— ์„ ์–ธ๋œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— java์˜ namespace์™€ ์ผ์น˜ ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค."

    <uses-permission android:name="android.permission.INTERNET"/>
	//2. permission : ์ „ํ™”๊ฑธ๊ธฐ, ์ธํ„ฐ๋„ท ๋“ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜์–ด ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์ •์˜
    
    <application
        android:name=".CalIngredientFoodApplication"
        //3. application name : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ตฌํ˜„๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ธŒํด๋ž˜์Šค์˜ ์ด๋ฆ„ / ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, ๊ฐ€์žฅ ๋จผ์ € ๊ฐ์ฒดํ™”๋˜๋ฉฐ ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ์—†์–ด๋„ ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ๋ฒ ์ด์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ
        android:allowBackup="true"
        //4. backup : ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ ๋ฐฑ์—…ํ•  ๊ฒƒ์ธ์ง€์˜ ์œ ๋ฌด
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        //5. icon๊ณผ label : ํ•ด๋‹น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋Œ€ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ icon๊ณผ label์„ ์„ค์ •
        android:supportsRtl="true"
        //6. supportsRtl : ์šฐ์ธก๋ถ€ํ„ฐ ํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ๋‚˜๋ผ์ผ ๊ฒฝ์šฐ true๋กœ ์„ค์ • / ์šฐ๋ฆฌ๋‚˜๋ผ์—์„  true๋กœ ์„ค์ •ํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผ
        android:theme="@style/Theme.CalIngredientFood"
        //7. AppTheme : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ธฐ๋ณธ ํ…Œ๋งˆ๋กœ ์‚ฌ์šฉํ•  ํ…Œ๋งˆ๋ฅผ ์„ค์ •
        android:usesCleartextTraffic="true">
        //8. usesCleartextTraffic : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ผ๋ฐ˜ ํ…์ŠคํŠธ HTTP์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€ / API 28 ์ด์ƒ ๋ถ€ํ„ฐ๋Š” false๊ฐ€ ๊ธฐ๋ณธ๊ฐ’
        
        <activity android:name="sang.gondroid.calingredientfood.presentation.MainActivity"
            android:windowSoftInputMode="adjustPan">
            //9. activity : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•  Activity์— ๋Œ€ํ•œ ์ •๋ณด / manifest ํŒŒ์ผ์— ์„ ์–ธ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
            //10. windowSoftInputMode : ํ‚ค๋ณด๋“œ ํ™œ์„ฑํ™” ์‹œ ๋ชจ๋“œ
                              adjustPan : ํ‚ค๋ณด๋“œ ํ™œ์„ฑํ™” ์‹œ UI ํ™”๋ฉด์ด ์กฐ์ •๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Œ
            <intent-filter>
            //11. intent filter : activity, service, broadcast receiver๊ฐ€ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” Intent ์œ ํ˜•์„ ์ง€์ •
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                //12. action : ์ธํ…ํŠธ ํ•„ํ„ฐ์— ์ž‘์—…์„ ์ถ”๊ฐ€
                //13. category : ์ธํ…ํŠธ ํ•„ํ„ฐ์— ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„์„ ์ถ”๊ฐ€
            </intent-filter>
        </activity>
    </application>
    
    <uses-feature android:name="android.hardware.sensor.compass" 
    			android:required="true" />
    //4. ๊ธฐ๊ธฐ ํ˜ธํ™˜์„ฑ : ์•ฑ์—์„œ ์š”๊ตฌํ•˜๋Š” ํ•˜๋“œ์›จ์–ด/์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋Šฅ ๋ฐ ํ˜ธํ™˜๋˜๋Š” ๊ธฐ๊ธฐ์œ ํ˜•์„ ๋“ฑ๋ก
    //			       ๋‚˜์นจ๋ฐ˜ ์„ผ์„œ๋ฅผ ๋“ฑ๋กํ–ˆ์œผ๋ฉฐ, ํ•ด๋‹น ์„ผ์„œ๊ฐ€ ํƒญ์žฌ๋˜์ง€ ์•Š์€ ๊ธฐ์ข…์€ Google Play Store์—์„œ ์„ค์น˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ

</manifest>

 

2๏ธโƒฃ Context

์‹œ์Šคํ…œ์ด ๊ด€๋ฆฌํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ˜„์žฌ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ํ•ธ๋“ค๊ณผ๋„ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•กํ‹ฐ๋น„ํ‹ฐ ๊ฐ์ฒด๋Š” ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์†๋ฐ›์•„ ํŠน์ • ๋ฆฌ์†Œ์Šค์™€ ํด๋ž˜์Šค ๊ทธ๋ฆฌ๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

Fragment๋‚˜ RecyclerViewAdapter ๋“ฑ Context๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Fragment๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ์ค‘ onAttach()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด ์ธ์ž๋กœ context๋ฅผ ๋ฐ›์•„์˜ค๋ฉฐ, RecyclerViewAdapter๋Š” onCreateViewHolder ๋ฉ”์†Œ๋“œ์—์„œ ์ธ์ž๋กœ ๋ฐ›์•„์˜ค๋Š” parent(viewGroup)์—์„œ context๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ค‘์š”ํ•œ ์ ์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ž˜ ๋ชป ์‚ฌ์šฉํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ  ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด Crash(๋น„์ •์ƒ ์ข…๋ฃŒ)๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…์— ๋”ฐ๋ผ Activity Context์™€ Application Context๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Activity Context : ์•กํ‹ฐ๋น„ํ‹ฐ ๋‚ด์—์„œ ์œ ํšจํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ

Application Context : ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ

์˜ˆ์‹œ : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์‹ฑ๊ธ€ํ„ด ์˜ค๋ธŒ์ ํŠธ์—์„œ Activity Context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋˜์ง€์•Š์•„์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒ