0
点赞
收藏
分享

微信扫一扫

Android Context 理解

树下的老石头 2021-09-29 阅读 88
Android
    //LoadedApk.java
    public Application makeApplication(boolean forceDefaultAppClass,
                                       Instrumentation instrumentation) {
        if (mApplication != null) {
            return mApplication;
        }
        //创建对象
        ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
        app = mActivityThread.mInstrumentation.newApplication(
                cl, appClass, appContext);
        //Application对象赋值给ContextImpl.mOuterContext
        appContext.setOuterContext(app);
        ...
        return app;
    }
    public Application newApplication(ClassLoader cl, String className, Context context)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {
        Application app = getFactory(context.getPackageName())
                .instantiateApplication(cl, className);
        //ContextImpl对象赋值给ContextWrapper.mBase
        app.attach(context);
        return app;
    }
 //ActivityThread.java
 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ActivityInfo aInfo = r.activityInfo;

        //创建对象ContextImpl
        ContextImpl appContext = createBaseContextForActivity(r);

        //反射创建Activity对象
        activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);

        //Activity对象赋值给ContextImpl.mOuterContext
        appContext.setOuterContext(activity);

        //ContextImpl对象赋值给ContextWrapper.mBase
        activity.attach(appContext, this, getInstrumentation(), r.token,
                r.ident, app, r.intent, r.activityInfo, title, r.parent,
                r.embeddedID, r.lastNonConfigurationInstances, config,
                r.referrer, r.voiceInteractor, window, r.configCallback,
                r.assistToken);
        return activity;
    }

从源码来看在创建Application和Activity对象时候都要事先创建ContextImpl,它们会把ContextImpl对象通过调用attach赋值给ContextWrapper.mBase。ContextImpl也会得到它们对应的对象引用赋值给mOuterContext。
getApplication()和getApplicationContext():主要区别在作用域不同,前者在Activity、Service即可获得,后者包含前者功能且BroadcastReceiver等也能获取应用的Application对象。
ContextImpl:是Context的具体功能都是在此类完成,如Application、Activity不会具体实现而是调用此类。

举报

相关推荐

0 条评论