任何视图都是依附在window上面的,通过windowManager中的方法,addview()可以完成window的创建和添加(添加到window某某中)。
文章后面对于toast显示过程除了涉及到window机制,还涉及到ipc机制,有两个binder,一个是发送toast请求的进程调用NMS(NotificationManagerService)中的方法,然后NMS回调发送请求的进程的方法,也是通过binder机制,为什么要这么麻烦?显示toast通过NMS进程的,笔者觉得这样易于管理,把toast的显示都通过一个进程nms管理同时避免一些问题。
一个应用中有多少个window?
应用window,子window,系统window。应用类 Window 对应一个 Acitivity,子 Window 不能单独存在,需要依附在特定的父 Window 中,比如常见的一些 Dialog 就是一个子 Window。系统 Window是需要声明权限才能创建的 Window,比如 Toast 和系统状态栏都是系统 Window。
window相当于屏幕的一块区域,具有z值,表现在较高z值的window可以覆盖下面的window,一个window可以放多个控件,在一个window中,控件有时也会存在覆盖的情况。
总之有view地方必定有window,先创建window然后设置view视图,最后通过viewrootimp将window添加到一个wms中的一个管理window集合中。