Android知识Android开发经验谈Android开发

Android内核剖析学习02理解Context

2017-06-23  本文已影响58人  咸鱼佬

此文为Android内核剖析学习

Context是啥

一个Context意味着一个场景,一个场景就是用户和操作系统的交互的过程。比如你打电话时,场景包括电话程序对应的界面,以及隐藏在界面后面的数据;当你看短信的时候,场景包括短信界面,以及隐藏在后面的数据

一个Activity,Service 也是一个Context

用户和系统的每一次交互都是一个场景,比如打电话,发短信,这些都是有界面的场景,也有没有界面的场景(service)。一个应用程序可以认为是一个工作环境,用户可以在这个工作环境中切换到不同的场景

Activity,Service 都是基于Context的。Activity除了基于Context类外,还实现了其他的重要接口,从设计的角度来看,interface仅仅是现实了某些功能,而extends才是类的本质

一个应用进程包含几个Context对象

Context数量 = Activity数量+Service数量+ 应用进程数量

Context相关类的继承关系

Application的Context

我的相关文章

1.ActivityThread#performLaunchActivity

Application app = r.packageInfo.makeApplication(false, 
mInstrumentation);     

2.LoadedApk#makeApplication

3.Instrumentation#newApplication

Application app = (Application)clazz.newInstance();
app.attach(context);
-----
//Application.attach()
final void attach(Context context) {
    attachBaseContext(context);//设置ContextWrapper的mBase,上面说过
    mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
}

4.appContext.setOuterContext(app);这里是调用ContextImpl中的方法,设置双向关联吧,有些处理可能需要回到ContextWrapper的子类中进行

Activity的Context

1..ActivityThread#performLaunchActivity

//创建Activity实例
activity = mInstrumentation.newActivity(
                cl, component.getClassName(), r.intent);

//创建ContextImpl并赋值个Activity的父类ContextWrapper中的mBase
Context appContext = createBaseContextForActivity(r, activity);

//调用Activity的attach方法
activity.attach(appContext.....);
//attach中
attachBaseContext(context);

跟Application差不多

Service的Context

ActivityThread#handleCreateService

service = (Service) cl.loadClass(data.info.name).newInstance();
ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
service.attach(context, this, data.info.name, data.token, app,
                ActivityManagerNative.getDefault());
//Service attach
attachBaseContext(context);

三个ContextWrapper子类的流程基本是一致的

上一篇 下一篇

猜你喜欢

热点阅读