看过Activity源码的同胞应该知道,Activity就是对Window对象进行了一个包装,里面的很多操作实质是由Window来完成的,但是Window类是一个抽象类,那么Activity里面的Window属性mWindow所引用的肯定不是Window对象本身,而是它的一个子类,那么到底是那个类,这个对我们后面代码的跟踪非常关键,因为如果找不到这个类,就找不到Activity的很多操作的实现是如何实现的。所以,下面就看看这个Window对象的创建过程。
我们直接看代码,在代码中说明,首先看Activity类。
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2 {
......
//很清楚,Activity里面有一个Window对象,Activity的很多操作就是调用的它的方法
private Window mWindow;
//这个方法在Activity启动的过程中会被执行
//在这个方法中,我们看到了Window对象的创建
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,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config) {
......
//创建Window对象
mWindow = PolicyManager.makeNewWindow(this);
......
}
}
在Activity里面有一个attach方法,在这个方法中创建了Window对象,下面看PolicyManager里面的makeNewWindow方法。
public final class PolicyManager {
......
private static final IPolicy sPolicy;
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
}
在这个代码里面调用的是IPolicy里面的makeNewWindow方法,一看IPolicy就知道它是一个接口,真正的实现是在它的实现类Policy中完成的,直接看代码。
public class Policy implements IPolicy {
......
public Window makeNewWindow(Context context) {
//看到没有,是一个PhoneWindow对象
return new PhoneWindow(context);
}
......
}
这就看到了创建的是一个PhoneWindow对象,也就是说Activity里面的Window属性引用的就是PhoneWindow对象,调用Window的方法实质调用的就是PhoneWindow的方法,都在这里实现了。
总结:
1、在启动Activity的过程中会调用一个attach函数
2、在attach函数中会执行PolicyManager.makeNewWindow(this)
3、进一步深入,真正执行makeNewWindow的其实是IPolicy,它只是被PolicyManager进行了包装。
4、IPolicy是一个接口,所以makeNewWindow的执行是由它的实现类Policy来执行的。
5、可以看到执行创建了一个PhoneWindow对象并且返回,最终也是将这个对象赋值给mWindow。