Android

[Android] Context, ContextWrapper, ContextImpl ์ดํ•ด

An effort will never betray ๐Ÿ˜Ž 2021. 11. 21. 22:48
๋ฐ˜์‘ํ˜•

Context

  ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด Context์— ๋Œ€ํ•ด์„œ๋Š” ์–ผํ• ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ์ˆœํžˆ ์˜์–ด๋กœ ํ•ด์„ํ•˜์—ฌ ๋ฌธ๋งฅ, ๋‹จ๋ฝ์˜ ์˜๋ฏธ๋กœ์„œ ์ปดํฌ๋„ŒํŠธ๋“ค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœํ•˜๋Š” ์ค‘์—๋„  Context๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ this(Activity), getContext, getApplicationContext์— ๋Œ€ํ•œ ์ดํ•ด์—†์ด ๋Œ€์ž…ํ•ด๋ณด๊ณ  ๋˜๋Š” ๊ฒƒ์„ ์„ค์ •ํ•  ๋•Œ๋„ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋ฉด์ ‘์—์„œ ๋Œ€๋‹ต์„ ๋ชปํ•  ๋•Œ๊ฐ€ ๋งŽ์•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š”๋ฐ ์˜ค๋ž˜์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋ผ๊ณ  ์ฒœ์ฒœํžˆ ์ œ๋Œ€๋กœ ๋ฐฐ์›Œ๋ณด๊ณ ์ž ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

  ๊ณต์‹๋ฌธ์„œ์—์„œ ์„ค๋ช…ํ•˜๊ธฐ๋ก  Context๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™˜๊ฒฝ ์ •๋ณด์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ,  ์ƒ์ˆ˜์™€ ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋กœ ์ด๋ค„์ง„ ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ์˜ ํ™˜๊ฒฝ ์ •๋ณด๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจํ‚ค์ง€ ์ด๋ฆ„, ๋ฆฌ์†Œ์Šค ์ •๋ณด ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ™˜๊ฒฝ ์š”์†Œ๋“ค์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Context ๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ContextImpl ํด๋ž˜์Šค๋กœ ์ฃผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค. 

https://developer.android.com/reference/android/content/Context

 

Context  |  Android Developers

 

developer.android.com

   Context๋ฅผ ํ†ตํ•ด์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๊ฑฐ๋‚˜, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ณ ,  ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฆฌ์†Œ์Šค๋“ค์„ ์ ‘๊ทผํ•  ๋•Œ๋„ Context๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

ContextImpl

  ์ถ”์ƒํด๋ž˜์Šค์ธ Context๋ฅผ ์‹ค์ œ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋กœ ์•ฑ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์†Œ์Šค์ฝ”๋“œ๋Š” ๊ณต๊ฐœ๋˜์–ด ์žˆ์–ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ContextImpl์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

  http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/app/ContextImpl.java#120

 

Cross Reference: /frameworks/base/core/java/android/app/ContextImpl.java

 

androidxref.com

 

ContextWrapper

  ContextWrapper๋Š” Context๋ฅผ ์ง์ ‘ ์ƒ์†ํ•œ ํด๋ž˜์Šค๋กœ ์ด๋ฆ„์ฒ˜๋Ÿผ Context๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ Context์™€ ๊ด€๋ จ๋œ ํ˜ธ์ถœ์„ ๋ชจ๋‘ ๋‹ด๋‹นํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

public class ContextWrapper extends Context {
    @UnsupportedAppUsage
    Context mBase;

    public ContextWrapper(Context base) {
        mBase = base;
    }

    /**
     * Set the base context for this ContextWrapper.  All calls will then be
     * delegated to the base context.  Throws
     * IllegalStateException if a base context has already been set.
     *
     * @param base The new base context for this wrapper.
     */
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }

    /**
     * @return the base context as set by the constructor or setBaseContext
     */
    public Context getBaseContext() {
        return mBase;
    }

    @Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

    @Override
    public Resources getResources() {
        return mBase.getResources();
    }
    
    ...
    
}

 

  ์œ„ ์ฝ”๋“œ๋Š” ContextWrapper์˜ ํด๋ž˜์Šค๋กœ ContextWrapper(Context base) ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž์™€ attachBaseContext ๋ฉ”์†Œ๋“œ์—์„œ๋Š” Context๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ณ  ์žˆ๋Š”๋ฐ ์ด ๋•Œ ๋Œ€์ž…๋˜๋Š” ๊ฒƒ์€ Context์˜ ๊ตฌํ˜„์ฒด์ธ ContextImpl ์ธ์Šคํ„ด์Šค๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ContextWrapper๋Š” ์‹ค์ œ๋กœ ContextImpl์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋Œ€์‹  ํ˜ธ์ถœํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

 

Class Diagram

  Context, ContextWrapper, ContextImpl, ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. Context๋ฅผ ์ง์ ‘ ์ƒ์†ํ•œ ํด๋ž˜์Šค๋Š” ContextWrapper์ด๊ณ , ContextWrapper๋ฅผ ์ƒ์†ํ•œ ๊ฒƒ์€ Activity, Service, Application ์ž…๋‹ˆ๋‹ค. Activity, Service, Application์€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  attachBaseContext๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Context๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋“ค์˜ attach ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‚ด๋ถ€์—์„œ attachBaseContext๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

@UnsupportedAppUsage
    final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor,
            Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) {
        attachBaseContext(context);
        
        ...
        
    }

  ์œ„ ์ฝ”๋“œ๋Š” Activity์˜ attach ๋ฉ”์†Œ๋“œ๋กœ ContextImpl์ด ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ œ๊ณต๋ฐ›๊ณ  attach ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ContextWrapper์— ContextImpl ์ธ์Šคํ„ด์Šค๊ฐ€ ๋Œ€์ž…๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ContextWrapper๋Š” ContextImpl์„ Proxy ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๋ณธ์—ฐ์˜ ContextImpl ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์—†์ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ, ๋™์ž‘๋“ค์„ ์žฌ์ •์˜๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ContextImpl ์ดํ•ด

 ContextWrapper์— ์ „๋‹ฌ๋œ ContextImpl์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž๋ฉด Activity, Service, Application ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๊ฐ๊ฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋ฐ›์€ ContextImpl์„ ๋ž˜ํ•‘ํ•˜๊ณ  ์žˆ๊ณ , getBaseContext๋Š” ์ œ๊ณต๋ฐ›์€ ContextImpl ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ getApplicationContext๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ContextImpl์˜ getApplicationContext๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ContextImpl์— ์žˆ๋Š” ActivityThread์˜ getApplication ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

class ContextImpl extends Context {
    private final static String TAG = "ContextImpl";
    private final static boolean DEBUG = false;

    /**
     * Map from package name, to preference name, to cached preferences.
     */
    private static ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>> sSharedPrefs;

    final ActivityThread mMainThread;
    
    private ContextImpl(ContextImpl container, ActivityThread mainThread,
            LoadedApk packageInfo, IBinder activityToken, UserHandle user, boolean restricted,
            Display display, Configuration overrideConfiguration, int createDisplayWithId) {
        mOuterContext = this;

        mMainThread = mainThread;
        
        ...
    }
    
    @Override
    public Context getApplicationContext() {
        return (mPackageInfo != null) ?
                mPackageInfo.getApplication() : mMainThread.getApplication();
    }

}

  ์ •๋ฆฌํ•˜์ž๋ฉด Activity, Service, Application ๋ชจ๋‘ ๋‚ด๋ถ€์ ์œผ๋กœ ActivityThread์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ณ , attach ๋ฉ”์†Œ๋“œ์—์„œ ActivityThread์™€ ContextImpl ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. attach ๋ฉ”์†Œ๋“œ์—์„œ ๋˜ ๋‹ค์‹œ attachBaseContext ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ  getBaseContext๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ContextImpl ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ  getApplicationContext๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด AcitivtyThread์˜ Application ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. Application ์ปดํฌ๋„ŒํŠธ ๋˜ํ•œ ContextWrapper๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณต๋ฐ›์€ ContextImpl์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๊ณ  Application ์ธ์Šคํ„ด์Šค๋Š” ์•ฑ์—์„œ 1๊ฐœ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.

 

 

ContextImpl ๋ฉ”์„œ๋“œ

  Context๋ฅผ ์ด์šฉํ•˜์—ฌ ์•กํ‹ฐ๋น„ํ‹ฐ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜, ์„œ๋น„์Šค ์‹คํ–‰ํ•˜๋Š”๋ฐ ์ด๋Š” ContextImpl์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ๋ณ„๋กœ ํ—ฌํผ(helper), ํผ๋ฏธ์…˜, ์‹œ์Šคํ…œ ์„œ๋น„์Šค ์ ‘๊ทผ ๊ด€๋ จํ•œ 3๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์•ฑ ํŒจํ‚ค์ง€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜,  SharedPreference ์„ค์ • ํŒŒ์ผ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ—ฌํผ(helper) ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค
  • Acitivity, BroadcastReceiver, Service ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ Permission Check ๋ฉ”์†Œ๋“œ๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ActivityManagerService๋ฅผ ํฌํ•จํ•œ ์‹œ์Šคํ…œ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด getSystemService ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ContextImpl ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ, ์‹œ์Šคํ…œ ์„œ๋น„์Šค๋ฅผ ๋งคํ•‘ํ•˜๊ณ  getSystemService๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘๋œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์„œ๋น„์Šค๊ฐ€ NOTIFICATION_SERVICE์™€ ๊ฐ™์ด ์ƒ์ˆ˜๋ช…์œผ๋กœ ๋งคํ•‘๋˜์–ด ์žˆ์–ด Context๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ๋ผ๋ฉด ์–ด๋””์„œ๋“  getSystemService๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ์„œ๋น„์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋‹ค์–‘ํ•œ Context ํ˜•ํƒœ

  1. Activity ์ธ์Šคํ„ด์Šค ์ž์‹ (this)
  2. getBaseContext ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” ContextImpl ์ธ์Šคํ„ด์Šค
  3. getApplicationContext๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” Application ์ธ์Šคํ„ด์Šค

  3๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ชจ๋‘ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์บ์ŠคํŒ…์„ ํ•˜๊ฒŒ ๋˜๋ฉด ClassCastException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Activity๋„ Context์˜ ์ž์‹ ํด๋ž˜์Šค์ด๊ณ  ContextImpl๋„ Context์˜ ์ž์‹ ํด๋ž˜์Šค์ง€๋งŒ, ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์บ์ŠคํŒ…์€ ํ•จ๋ถ€๋Ÿฌ ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

 

  Activity์˜ onCreate์—์„œ setContetView๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” View๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.textView);
        Log.d(TAG, "1st = "+(textView.getContext() == this));
        Log.d(TAG, "2nd = "+(textView.getContext() == getBaseContext()));
        Log.d(TAG, "3rd = "+(textView.getContext() == getApplicationContext()));
        Log.d(TAG, "4th = "+(textView.getContext() == getApplication()));
    }

  View ์ƒ์„ฑ์ž์— Context ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ด Context๋ฅผ ์–ด๋””์„œ ์™”๋Š”์ง€ ํ™•์‹คํžˆ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋งŒ true๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ View์™€ ์—ฐ๊ด€์„ฑ์ด ๊ฐ€์žฅ ํฐ Activity๋ผ๊ณ  ์œ ์ถ”ํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ด๋ฅผ ํ•˜์ž๋ฉด, setContentView ๋Š” AppCompatActivity ํด๋ž˜์Šค์˜ setContentView ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚ด๋ถ€์—์„œ AppCompatDelegate์˜ setContentView๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. AppCompatDelegate ์ดˆ๊ธฐํ™”์‹œ์— Activity ์ž์‹ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ์—์„œ true๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 @NonNull
    public AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, this);
        }
        return mDelegate;
    }

 

 

Context ์‚ฌ์šฉ ์ฃผ์˜์ 

  Context ์‚ฌ์šฉ ์‹œ์—๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์ž˜ ์ƒ๊ฐํ•ด์„œ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ApplicationContext๋Š” ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์•ฑ์—์„œ 1๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ์˜ค๋ธŒ์ ํŠธ๋‚˜ ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Activity์˜ Context๋ฅผ ์‹ฑ๊ธ€ํ†ค ์˜ค๋ธŒ์ ํŠธ์— ์ฐธ๊ณ ํ•˜๊ฒŒ ๋˜๋ฉด Activity๊ฐ€ onDestroy๊นŒ์ง€ ๊ฐ”์ง€๋งŒ Context๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— null์ด ๋˜์ง€ ์•Š์•„ GC์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, Activity ๊ฐ€ ํŒŒ๊ดด๋˜์—ˆ์ง€๋งŒ ์‹ฑ๊ธ€ํ†ค์—์„œ ์ฐธ์กฐ๋˜๊ณ  ์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ๋”ฐ๋ผ์„œ Activity, Service, Application์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์ž˜ ํŒŒ์•…ํ•˜๊ณ  Context๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

์ฐธ๊ณ 

 

[Android, Context] Context ๋„Œ ๋ฌด์—‡์ด๋”๋ƒ?

์•ˆ๋…•ํ•˜์„ธ์š”. ๋ธ”๋ž™์ง„์ž…๋‹ˆ๋‹ค. ๋„Œ ๋ฌด์—‡์ด๋”๋ƒ? ์„ธ๋ฒˆ์งธ ์‹œ๋ฆฌ์ฆˆ๋กœ ์ด๋ฒˆ์—๋Š” Context์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ์‹œ๋ฆฌ์ฆˆ Thread ๋„Œ ๋ฌด์—‡์ด๋”๋ƒ? Handler ๋„Œ ๋ฌด์—‡์ด๋”๋ƒ? Context? Interface to global information ab..

black-jin0427.tistory.com

  • ์•ˆ๋“ค๋กœ์ด๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ Next Step p71 ~ p76
๋ฐ˜์‘ํ˜•