在阅读本文之前建议先阅读我的另外一篇Java层Binder机制详解,因为里面有些地方涉及到通过进程间通过Binder机制通信。
在Android将窗口分为三类:应用窗口,子窗口,系统窗口
应用窗口一般需要和一个Activity对应,子窗口是有父窗口的窗口,系统窗口时由系统创建的窗口,用户是无法创建系统窗口的(Toast,输入法窗口,壁纸窗口除外)
这里我主要分析一下应用窗口的创建过程,如果不对的地方希望能提出。
上面说了应用窗口时和Activity对应的,所以应用窗口时伴随Activity创建而创建的,所以首先从Activity的创建开始,Android的所有的应用的入口函数是ActivityThread的main函数,经过辗转调用就会执行到handleLaunchActivity,那我们就从handleLaunchActivity开始吧
private final void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
//创建一个Activity
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
Bundle oldState = r.state;
//调用Activity中的onResume方法
handleResumeActivity(r.token, false, r.isForward);
}
函数中通过调用performLaunchActivity创建一个Activity,然后调用Activity的onResume方法,那就进入到performLaunchActivity中看是如何创建一个Activity的
private final Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
// System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");
Activity activity = null;
try {
//通过反射机制创建一个Activity
java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
r.intent.setExtrasClassLoader(cl);
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);
}
}
try {
//调用attach方法
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstance,
r.lastNonConfigurationChildInstances, config);
//执行Activity的onCreate方法