Activityd的创建要经过一堆的初始化过程,我们平时在开发中只需要使用Intent就行了,至于如何让创建,以及如何加载apk里面的类资源以及文件资源都给屏蔽掉了,Intent到底是什么?为什么可以跨进程?为什么可以发广播又可以启动服务,还可以传参?Activity到底是什么,既可以显示空间又可以窗口管理,又可以路由消息?到底是什么机制在支撑着Activity运行?
这篇只简单的谈论下Activity的上下文创建过程。
Activity与ContextImpl的关联:
继承关系:
public class Activity extends ContextThemeWrapper
public class ContextThemeWrapper extends ContextWrapper
public class ContextWrapper extends Context
class ContextImpl extends Context
Activity本身是一个Context类型的子类。
在ContextWrapper中间接实现了Context相关的方法,所以Activity也具有这些方法。
而在ContextWrapper中对Context相关的方法的实现实际上是调用mBase的相关方法的。
而这个mBase实际上就是ContextImpl的实例。
也就是说,所有Context子类型的对象调用Context相关方法时,实际上都是调用的ContextImpl实例的方法。
mBase的赋值是在ContextWrapper的以下方法中:
protected void attachBaseContext(Context base) {
if (mBase != null) {
throw new IllegalStateException("Base context already set");
}
mBase = base;
}
而这个方法的调用是在Activity的以下方法中:
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,
Object lastNonConfigurationInstance,
HashMap<String,Object> lastNonConfigurationChildInstances,
Configuration config) {
attachBaseContext(context);
而这个方法的调用是在ActivityThread的以下方法中:
private final Activity performLaunchActivity(ActivityRecord r, Intent customIntent)
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
ContextImpl appContext = new ContextImpl();
appContext.init(r.packageInfo, r.token, this);
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);
这个方法是在luncher一个Activity时调用的。
通过方法可以看出,系统首先创建一个Activity对象,然后构造相关的Application对象。
之后,创建ContextImpl对象,并调用init方法初始化相关成员,之后将其添加给Activity对象。
这样,Activity就和ContextImpl对象关联上了。
在之后会调用Activity相关的回调函数,比如onCreate()等。