Context解析

Context是一个抽象类,内部定义了很多方法和静态常量,其真正的实现类是ContextImpl,而常见的Activity和Service则是通过装饰器的形式去拓展ContextImpl的功能。

Context的实现类关系图
Context

  • Activity与Context的关系

在Activity的创建过程中,会调用ActivityThread中的performLaunchActivity方法

// ActivityThread.java
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ...
    //创建context对象
    ContextImpl appContext = createBaseContextForActivity(r);
    Activity activity = null;
    try {
        //创建activity对象
        activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);
        ...
    } catch (Exception e) { }

    try {
        //创建或获取application对象
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        if (activity != null) {
            ...
            //把ContextImpl内部的mOuterContext指向activity
            appContext.setOuterContext(activity);
            //把activity中的mBase指向ContextImpl
            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);
            ...
        }
    } catch (SuperNotCalledException e) { }

    return activity;
}

//Activity.java
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) {
    //绑定和ContextImpl的关系        
    attachBaseContext(context);
}
  • Application中的Context
    在上述创建Application的方法中
//LoadedApk.java
public Application makeApplication(boolean forceDefaultAppClass,
        Instrumentation instrumentation) {
    if (mApplication != null) {
        return mApplication;
    }
    Application app = null;
    try {
    	//创建ContextImpl对象	
        ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
        //创建Application对象,并把ContextImpl对象绑定到mBase中
        app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);
        //把application对象绑定到ContextImpl对象中
        appContext.setOuterContext(app);
    } catch (Exception e) { }
    mActivityThread.mAllApplications.add(app);
    mApplication = app;
    if (instrumentation != null) {
        try {
        	//调用Application的onCreate方法
            instrumentation.callApplicationOnCreate(app);
        } catch (Exception e) {
        }
    }
    return app;
}

//Instrumentaion.java
static public Application newApplication(Class<?> clazz, Context context)
        throws InstantiationException, IllegalAccessException, 
        ClassNotFoundException {
    Application app = (Application)clazz.newInstance();
    //进行绑定
    app.attach(context);
    return app;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值