创建应用窗口
一、创建Activity
1. 应用窗口必须对应Activity,AMS通知客户端ActivityThread启动Activity 。反射创建Activity对象
二、创建Window
2. activity.attach()方法设置内部变量。
3. activity.attach()方法创建Window对象。PolicyManager.makeNewWindow()创建(通过com.android.internal.policy.impl.Policy配置)创建PhoneWondow,赋值给Activity.mWindow
设置setCallback() [ Window的calback为当前Activity,就是为什么用户消息能够传递到Activity中的原因 ]
4. Window.mWindowManager赋值。WindowManager是一个接口,两个实现类Window.LocalWindowManager(是一个壳,其具体实现在其内部的WindowManagerImpl中) 与 WindowManagerImpl
三、创建ViewRoot
5. 添加View,从performLaunchActivity内部调用callActivityOnCreate开始,最终调用onCreate中的setContentView。
setContentView源码getWidnow.setContentView()
installDecor() 创建标题栏等
6. setContentView源码 ,分析Theme相关设置
7. Activity准备好后通知AMS,AMS最终调用Activity.makeVisible()
8. Activity.makeVisible()源码,窗口类型是TYPE_APPLICATION。 ViewGroup.addView 中“关卡” 判断WindowManager层级
9. LocalWindowManager.addView(WindowManagerImpl.addView一个应用仅有一个此对象),其中包含3个数组。通过ViewRoot.setView完成关键添加工作。
四、窗口添加
10. 数组mViews、mRoots、mParams 各保存View、ViewRoot、WindowManager.LayoutParams
11. 执行ViewRoot.setView 完成最后的窗口添加工作。
mAttachInfo赋值,
requestLayout 发出界面重新布局请求
sWindowSession.add 通知WMS添加窗口
参考资料:
《Android 内核剖析》 第8章 8.3 创建应用窗口
图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
android的窗口机制分析------UI管理系统 (Window层级)