window和windowmanager
一、window
1.window属性
(1)type属性
应用window--一个Activity(1-99层)
子window---不能单独存在,如dialog(1000-1999层)
系统window--需要声明权限,如toast及状态栏 (2000-2999层)
<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>
(2)flags属性
FLAG_SHOW_LOCKED等
window分层,层级大的覆盖小的
添加view
更新view
删除view
可以做的事情:如可以拖动的window效果,view的onTouch方法中改变window的位置
2.window的内部机制
window(不是实际存在的)----------viewRootImpl(建立联系)------View(才是window存在的实体)
window的添加是一次IPC调用
工厂模式:
windowManagerImpl-----windowManagerGlobal(以工厂的形式向外提供实例)-----对window进行添加、删除、更新等操作-----IWindowSesssion----Session------windowMagagerService
二、window的创建过程
1.Activity
(1)Activity启动过程中,会由ActivityThread重点额performLaunchActivity()来完成整个启动过程,方法内部会通过类加载器创建Activity的实例对象,并调用attach方法为
其关联运行过程中所依赖的一系列上下文环境变量
Activity的attach方法:
创建Activity所属window对象,并设置回调接口(window接收到外界状态改变时会回调Activity的方法 onAttachedToWindow、onDetachedFromWindow、dispatchEvent等)
Activity的window是通过policyManager的一个工厂方法创建的---policy---makeNewWindow----phoneWindow
(2)Activity视图依附window
setContentView()方法
phoneWindow----DecorView(Framelayout,顶级view,包含标题栏和内部栏content----------view添加到Ddecorview的mContentParent中(inflate方法)----回调onContentChanged方法通知视图改变
phoneWindow通过generateLayout方法加载具体布局文件到Decorview)
------handleResumeActivity方法(调用onResume及makeVisibale方法可以看到)
2.Didlog 子window创建
policyManager---policy---makeNewWindow----phoneWindow----setContentView
3.toast系统window
采用了handle
NotificationManagerService
任何 View 都是附属在一个 Window 上面的,Window 表示一个窗口的概念,也是一个抽象的概念,Window 并不是实际存在的,它是以 View 的形式存在的。
WindowManager 是外界也就是我们访问 Window 的入口,Window 的具体实现位于 WindowManagerService 中,WindowManagerService 和 WindowManager 的交互是一个 IPC 过程。
三、window与windowmanager的桥接模式