关于Windowmager的一些知识梳理
原文链接
FLAG_SHOW_WHEN_LOCKED :当屏幕锁定时,窗口可以被看到。这使得应用程序窗口优先于锁屏界面。可配合FLAG_KEEP_SCREEN_ON选项点亮屏幕并直接显示在锁屏界面之前。可使用FLAG_DISMISS_KEYGUARD选项直接解除非加锁的锁屏状态。此选项只用于最顶层的全屏幕窗口
次方法可用在锁屏歌嘛!
WindowsManger 继承Viewmanager 实现三个:addView(View v,ViewGroup.LayoutParam param ),updataViewLayout(View v,ViewGroup.LayoutParam param),removeView(View v)
每一个window 都是一个WindowRootImpl 和一个view组成 windowRootImpl 将View 和Window 建立联系
window 添加 依赖windowmanager而他又是一个接口 windowRootImpl 去实现View的几个方法:
而他又将具体实现交给了WindowManagerGlobal
1.检查参数是否有效,为空则子window 为其调整开启硬件加速
2.监听系统属性的变化
3.判断是否是重复添加的view
4.判断是否是panelWindow 更便于以后获取当前参数
5.将window一系列参数添加进集合
6.WindowRootImpl.setView 更新界面完成window 添加 内部通过requestLayout异步刷新
scheduleTraversals便是View的绘制入口。
IWindowSession,它是一个Binder对象中间人 Window添加实际是一个IPC
Session 内部addwindow 通过Windowsservice会保留每一个活动session
整个流程:
WindowManger -> WindowMangerImpl -> WindowManagerGlobal>addView -> ViewRootImpl- >setView->requestLayout - > (IPC)Session>addToDisplay - > WindowMangerService->addWindow
window 删除过程:
ViewRootImpl 通过removeViewLooked删除 里面有同步removeViewImmediate和异步removeView
WindowManger -> (实现类)WindowMangerImpl ->(委托类) WindowManagerGlobal>removeView>removeViewLocked -> ViewRootImpl>doDie>dispatchDetachedFromWindow -> (IPC) Session>remove -> WindowMangerService>removeWindow