一、前言:
【1】Android系统中窗口分为三类:
应用窗口:每个Activity对应的窗口;
子窗口:必须依附在应用窗口上的窗口;
系统窗口:由系统创建,不依赖任何应用窗口。
二、应用窗口的创建过程:
【1】初始化Window、WindowManager:
先回顾一下Activity的启动过程——由ActivityManagerService通过Bindler进程间通信机制向客户端进程ActivityThread发送创建新的Activity对象的通知,所有Activity的创建都在对应应用程序进程ActivityThread中完成。
在Activity创建完成后,会调用Activity的attach方法。
分析:
1、在attach方法中首先创建一个PhoneWindow,PhoneWindow是实现了抽象类Window的子类;
2、为PhoneWindow设置事件回调监听。由于设置了事件回调监听,Activity可以分发处理触摸事件;
3、为PhoneWindow设置窗口消失回调监听。由于设置了窗口消失回调监听,在Window消失后,可finish掉Activity;
4、将当前Activity的WindowManager对象设置给PhoneWindow;
5、Activity的WindowManager和PhoneWindow的WindowManager是同一个。
【2】添加View到应用窗口:
我们已经知道了Window是如何在Activity中创建,那么View是如何添加到Window上?
首先,先来看下setContentView的源码:
getWindow()得到的就是Activity的成员变量mWindow,也就是PhoneWIndow。而PhoneWindow的setContentView的实现过程就是将layout给inflate到window上。
【3】Activity添加窗口Window的过程:
前面已经讲完了“Window是如何添加view的”,“Window和Activity一一对应”,现在讲下“Activity是如何添加Window的”。
Activity是通过ActivityThread的handleResumeActivity来启动Activity:
可以看到是通过WindowManager的addView方法来对Window的View进行添加。