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的流程的主要内容,如果未能解决你的问题,请参考以下文章