Context 的继承关系如下所示:
所以,Android 中的 Context 数量 = Activity 的数量 + Service 的数量 + 1 (Application)
Context 的用途比较广,比如用来获取图片、字符串,显式对话框等,大部分情况下,使用哪个 Context 都可以,少数情况下只能使用特定的 Context. 比如启动 Activity 的时候,要求传入 Activity 的 Context,因为 AMS 需要直到启动指定 Activity 的 Activity 的栈。一般情况下,能使用 Application 的 Context 尽量使用它的,因为它的生命周期更长。
Context 之间使用的是装饰者设计模式,其中 Context 是一个抽象的类。ContextWrapper 内部实际使用 ContextImpl 实现的,因此所有的逻辑基本是在 ContextImpl 中实现的。然后对于 ContextThemeWrapper,它在 ContextWrapper 的基础之上又进行了一层装饰,就是与主题相关的东西。新版的 Activity 启动中将 Activity 的各个回调执行的逻辑放在了各个 ClientTransactionItem 中,比如:LaunchActivityItem 表示用来启动 Activity。 最终执行逻辑的时候是调用它们的 execute() 方法并使用传入的 ClientTransactionHandler 真正执行任务。而这里的 ClientTransactionHandler 实际上就是 ActivityThread,所以它将调用到 Activity 的
handleLaunchActivity()
启动 Activity. 然后程序进入到performLaunchActivity()
中。这个方法中会创建上面的 Application 和 Activity 对应的 Context:
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
// ...
// 创建 Activity 的 Context
ContextImpl appContext = createBaseContextForActivity(r);
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.getClassLoader();
// 创建新的 Activity
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
// ...
} catch (Exception e) {
// ... handle exception
}
try {
// 创建应用的 Application
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
if (activity != null) {
CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
// Activity 的配置
Configuration config = new Configuration(mCompatConfiguration);
if (r.overrideConfig != null) {
config.updateFrom(r.overrideConfig);
}
// 创建窗口
Window window = null;
if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
window = r.mPendingRemoveWindow;
r.mPendingRemoveWindow = null;
r.mPendingRemoveWindowManager = null;
}
// 关联 Activity 和 Context
appContext.setOuterContext(activity);
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);
// ...
// 设置 Activity 的主题
int theme = r.activityInfo.getThemeResource();
if (theme != 0) {
activity.setTheme(theme);
}
// 回调 Activity 的生命周期方法
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
r.activity = activity;
}
r.setState(ON_CREATE);
mActivities.put(r.token, r);
} catch (SuperNotCalledException e) {
throw e;
} catch (Exception e) {
// ... handle exception
}
return activity;
}
public Application makeApplication(boolean forceDefaultAppClass, Instrumentation instrumentation) {
// ...
try {
// 创建 Application 的 Context
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
// 关联 Application 和 Context
appContext.setOuterContext(app);
} catch (Exception e) {
// ... handle exception
}
// ...
return app;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于