Android应用程序窗口Activity的运行上下文环境Context的创建过程分析资料.docx
- 文档编号:1493408
- 上传时间:2022-10-22
- 格式:DOCX
- 页数:13
- 大小:144.42KB
Android应用程序窗口Activity的运行上下文环境Context的创建过程分析资料.docx
《Android应用程序窗口Activity的运行上下文环境Context的创建过程分析资料.docx》由会员分享,可在线阅读,更多相关《Android应用程序窗口Activity的运行上下文环境Context的创建过程分析资料.docx(13页珍藏版)》请在冰豆网上搜索。
Android应用程序窗口Activity的运行上下文环境Context的创建过程分析资料
Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
在前文中,我们简要介绍了Android应用程序窗口的框架。
Android应用程序窗口在运行的过程中,需要访问一些特定的资源或者类。
这些特定的资源或者类构成了Android应用程序的运行上下文环境,Android应用程序窗口可以通过一个Context接口来访问它,这个Context接口也是我们在开发应用程序时经常碰到的。
在本文中,我们就将详细分析Android应用程序窗口的运行上下文环境的创建过程。
在前面一文中提到,Android应用程序窗口的运行上下文环境是通过ContextImpl类来描述的,即每一个Activity组件都关联有一个ContextImpl对象。
ContextImpl类继承了Context类,它与Activity组件的关系如图1所示:
这个类图在设计模式里面就可以称为装饰模式。
Activity组件通过其父类ContextThemeWrapper和ContextWrapper的成员变量mBase来引用了一个ContextImpl对象,这样,Activity组件以后就可以通过这个ContextImpl对象来执行一些具体的操作,例如,和等操作。
同时,ContextImpl类又通过自己的成员变量mOuterContext来引用了与它关联的一个Activity组件,这样,ContextImpl类也可以将一些操作转发给Activity组件来处理。
在前面一文中,我们已经详细分析过一个Activity组件的启动过程了。
在这个启动过程中,最后一步便是通过ActivityThread类的成员函数performLaunchActivity在应用程序进程中创建一个Activity实例,并且为它设置运行上下文环境,即为它创建一个ContextImpl对象。
接下来,我们就从ActivityThread类的成员函数performLaunchActivity开始,分析一个Activity实例的创建过程,以便可以从中了解它的运行上下文环境的创建过程,如图2所示:
这个过程一共分为10个步骤,接下来我们就详细分析每一个步骤。
Step1.ActivityThread.performLaunchActivity
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
publicfinalclassActivityThread{
......
InstrumentationmInstrumentation;
......
privatefinalActivityperformLaunchActivity(ActivityClientRecordr,IntentcustomIntent){
......
ComponentNamecomponent=r.intent.getComponent();
......
Activityactivity=null;
try{
java.lang.ClassLoadercl=r.packageInfo.getClassLoader();
activity=mInstrumentation.newActivity(
cl,component.getClassName(),r.intent);
......
}catch(Exceptione){
......
}
try{
Applicationapp=r.packageInfo.makeApplication(false,mInstrumentation);
......
if(activity!
=null){
ContextImplappContext=newContextImpl();
......
appContext.setOuterContext(activity);
......
Configurationconfig=newConfiguration(mConfiguration);
......
activity.attach(appContext,this,getInstrumentation(),r.token,
r.ident,app,r.intent,r.activityInfo,title,r.parent,
r.embeddedID,r.lastNonConfigurationInstance,
r.lastNonConfigurationChildInstances,config);
......
mInstrumentation.callActivityOnCreate(activity,r.state);
......
}
......
}catch(SuperNotCalledExceptione){
......
}catch(Exceptione){
......
}
returnactivity;
}
}
这个函数定义在文件frameworks/base/core/Java/android/app/ActivityThread.java中。
要启动的Activity组件的类名保存在变量component。
有了这个类名之后,函数就可以调用ActivityThread类的成员变量mInstrumentation所描述一个Instrumentation对象的成员函数newActivity来创建一个Activity组件实例了,并且保存变量activity中。
Instrumentation类是用来记录应用程序与系统的交互过程的,在接下来的Step2中,我们再分析它的成员函数newActivity的实现。
创建好了要启动的Activity组件实例之后,函数接下来就可以对它进行初始化了。
初始化一个Activity组件实例需要一个Application对象app、一个ContextImpl对象appContext以及一个Configuration对象config,它们分别用来描述该Activity组件实例的应用程序信息、运行上下文环境以及配置信息。
这里我们主要关心运行上下文环境的创建过程,即ContextImpl对象appContext的创建过程,这个过程我们在接下来的Step4中再分析。
ContextImpl对象appContext创建完成之后,函数就会调用它的成员函数setOuterContext来将与它所关联的Activity组件实例activity保存在它的内部。
这样,ContextImpl对象appContext以后就可以访问与它所关联的Activity组件的属性或者方法。
在接下来的Step5中,我们再分析ContextImpl类的成员函数setOuterContext的实现。
接着,函数就调用Activity组件实例activity的成员函数attach来将前面所创建的ContextImpl对象appContext以及Application对象app和Configuration对象config保存在它的内部。
这样,Activity组件实例activity就可以访问它的运行上下文环境信息了。
在接下来的Step6中,我们再分析Activity类的成员函数attach的实现。
最后,函数又通过调用ActivityThread类的成员变量mInstrumentation所描述一个Instrumentation对象的成员函数callActivityOnCreate来通知Activity组件实例activity,它已经被创建和启动起来了。
在接下来的Step9中,我们再分析它的成员函数callActivityOnCreate的实现。
接下来,我们就分别分析Instrumentation类的成员函数newActivity、ContextImpl类的构造函数以及成员函数setOuterContext、Activity类的成员函数attach和Instrumentation类的成员函数callActivityOnCreate的实现。
Step2.Instrumentation.newActivity
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
publicclassInstrumentation{
......
publicActivitynewActivity(ClassLoadercl,StringclassName,
Intentintent)
throwsInstantiationException,IllegalAccessException,
ClassNotFoundException{
return(Activity)cl.loadClass(className).newInstance();
}
......
}
这个函数定义在文件frameworks/base/core/java/android/app/Instrumentation.java中。
参数cl描述的是一个类加载器,而参数className描述的要加载的类。
以className为参数来调用cl描述的是一个类加载器的成员函数loadClass,就可以得到一个Class对象。
由于className描述的是一个Activity子类,因此,当函数调用前面得到的Class对象的成员函数newInstance的时候,就会创建一个Activity子类实例。
这个Activity实例就是用来描述在前面Step1中所要启动的Activity组件的。
Activity子类实例在创建的过程,会调用父类Activity的默认构造函数,以便可以完成Activity组件的创建过程。
Step3.newActivity
Activity类定义在文件frameworks/base/core/java/android/app/Activity.java中,它没有定义自己的构造函数,因此,系统就会为它提供一个默认的构造函数。
一般来说,一个类的构造函数是用来初始化该类的实例的,但是,系统为Activity类提供的默认构造函数什么也不做,也就是说,Activity类实例在创建的时候,还没有执行实质的初始化工作。
这个初始化工作要等到Activity类的成员函数attach被调用的时候才会执行。
在后面的Step6中,我们就会看到Activity类的成员函数attach是如何初始化一个Activity类实例的。
这一步执行完成之后,回到前面的Step1中,即ActivityThread类的成员函数performLaunchActivity中,接下来就会调用ContextImpl类的构造函数来创建一个ContextImpl对象,以便可以用来描述正在启动的Activity组件的运行上下文信息。
Step4.newContextImpl
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
classContextImplextendsContext{
......
privateContextmOu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 应用程序 窗口 Activity 运行 上下文 环境 Context 创建 过程 分析 资料