Andoird WindowManager管理Window的流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Andoird WindowManager管理Window的流程相关的知识,希望对你有一定的参考价值。

参考技术A 分析Windowmanager如何管理window的流程。

添加、更新、删除一个Window:

参数说明:
1、flag,控制Window的显示特性,参数很多可自行查询API,常用如下
FLAG_NOT_TOUCH_MODAL:Window区域内的点击事件自己处理,之外的传递给底层Window,通常打开此标记
FLAG_NOT_FOCUSALE:不需要焦点,直接传递到底层Window
FLAG_SHOW_WHEN_LOCKED:顾名思义,显示在锁屏上
2、type,三种类型。Window是分层的
应用Window:层级1-99,对应一个activity
子Window:层级1000-1999,需要在特定的父Window中,比如Dialog
系统Window:层级2000-2999,需添加权限SYSTEM_ALERT_WINDOW,比如状态栏

ViewManager只是个interface,搜索源码,实现类为WindowManagerImpl

然后交给代理类mGlobal即WindowManagerGlobal

mViews,mRoots,mParams是三个ArrayList,用来保存所有window对应的view、ViewRootImpl和布局参数
ViewRootImpl:WindowManager创建它来管理view
最后通过ViewRootImpl.setView来设置view

然后是mWindowSession.addToDisplay,其实现是Session.addToDisplay

所以其实是WindowManagerService的addWindow,这里addWindow就是WindowManagerService把window如何布置到屏幕上的具体深入细节了,就不跟了。

WindowManagerGlobal的removeView调用



ViewRootImpl.die

mHandler.sendEmptyMessage(MSG_DIE);延时调用,最终还是会直接调用doDie();

doRemoveView,刷新mViews,mRoots,mParams数据
dispatchDetachedFromWindow中主要行为三点:

WindowManagerGlobal的updateViewLayout

ViewRootImpl.setLayoutParams刷新LayoutParams

mTraversalRunnable调用performTraversals,这个就是所有view的绘制过程了,重绘时会调用relayoutWindow然后调用mWindowSession.relayout,即WindowManagerService的relayoutWindow方法

Windowmanager通过ViewRootImpl来添加、更新和删除window,最终的实现都是WindowmanagerService具体实现。本文目的也是掌握Windowmanager管理window的流程。

以上是关于Andoird WindowManager管理Window的流程的主要内容,如果未能解决你的问题,请参考以下文章

WindowManager 简单悬浮框的实现

WindowManager 简单悬浮框的实现

小米手机无法使用WindowManager的addView,怎么解决

全方位来认识WindowManager

全方位来认识WindowManager

使用WindowManager添加View——悬浮窗口的基本原理