WindowManager体系关系
我们这里从Window(这里Window是个抽象概念)开始了解WindowManager,这些window都会与WindowManager建立关联,比如Activity、Toast、Dialog、PopupWindow等。
Activity中
PopupWindow中
那么这个WindowManager为何有如此大作用呢?我们看到WindowManager是一个接口并且继承ViewManager,而ViewManager中定义了三个功能方法,分别是add、update、remove,所以WindowManager是操作窗口添加、刷新和消失的管理类。
接下来看WindowManager的实现类WindowManagerImpl(ContextImpl.getSystemService()这里不再细说),这个类中我们看到又把操作交给了WindowManagerGlobal类,WindowManagerImpl只是起到桥接模式的作用。
再继续跟踪WindowManagerGlobal类,这里我们看addView
这里又出现了一个新的类ViewRootImpl,然后ViewRootImpl调用了setView()方法
这里mWindowSession是一个Binder对象,从这里开始通过Binder进程间通信,它的server端实现为Session,调用的是WindowManagerService(所在SystemServer进程)中,接着我们具体看一下WMS中Session做了什么。
Session中调用了WMS的addwindow()方法将自身传进去,每个应用程序都会对应一个Session,WMS会用一个ArrayList将这些Session保存起来,剩下的工作将交由WMS处理。
这里只截取方法名,具体可看源码。这个方法里主要做两件事,一是这个方法返回的是一个状态值,进行了一系列的权限、状态、窗口类型等;当然这只是一部分,另外一个重点是会通过Session向SurfaceFinger申请分配Surface以渲染绘制到屏幕上。
以上是通过分析add方式对WindowManagerService流程的浅析,其实类似,这里不再细说。