本篇开始,我们来谈一谈Android窗口的显示过程,注意,我们不包含Activity的冷启动过程,侧重于Activity,Window关系的建立。
窗口的显示包含了Activity,view,Window,WindowManager,WMS,SurfaceFlinger等几个主要角色,本篇我们首先看看从Activity到window发生了什么。
本篇代码基于原生Android Q
一.显示过程概览
话不多说,先上一张图:
二.核心流程代码
图中的流程基本已经比较清晰的展示了从Activity启动到加入到WindowManager的过程,下面贴几段主要的流程代码:
1.performLaunchActivity
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
//......
ContextImpl appContext = createBaseContextForActivity(r); //创建appContext
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.getClassLoader();
activity = mInstrumentation.newActivity( //创建Activity
cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
r.intent.prepareToEnterProcess();
if (r.state != null) {
r.state.setClassLoader(cl);
}
} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) {
throw new RuntimeException(
"Unable to instantiate activity " + component
+ ": " + e.toString(), e);
}
}
//......
//内部会创建window和WindowManager
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,
r.assistToken);
if (customIntent != null) {
activity.mIntent = customIntent;
}
r.lastNonConfigurationInstances = null;
checkAndBlockForNetworkAccess();
activity.mStartedActivity = false;
int theme = r.activityInfo.getThemeResource();
if (theme != 0) {
activity.setTheme(theme);
}
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
//内部会调用Activity的onCreate方法
mInstrumentation.callActivityOnCreate(activity, r.state);
}
if (!activity.mCalled) {
throw new SuperNotCalledException(
"Activity " + r.intent.getComponent().toShortString() +
" did not call through to super.onCreate()");