AppWindowToken对象创建的过程: Activity组件在WindowManagerService服务和ActivityManagerService服务之间的连接是通过一个AppWindowToken对象来描述的。 AppWindowToken类是从WindowToken类继续下来的。WindowToken类也是用来标志一个窗口的,不过这个窗口类型除了是应用程序窗口,即Activity组件窗口之外, 还可以是其它的,例如,输入法窗口或者壁纸窗口类型等,而AppWindowToken类只是用来描述Activity组件窗口。
1、ActivityStack.startActivityLocked()
↓
2、WindowManagerService.addAppToken()
↓
3、new AppWindowToken()
↓
4、mTokenMap.put(token.asBinder(), atoken)
Session对象的创建过程 :应用程序进程在为它里面启动的第一个Activity组件的视图对象创建一个关联的ViewRoot对象的时候,就会向WindowManagerService服务请求返回一个类型为Session的Binder本地对象,这样应用程序进程就可以获得一个类型为Session的Binder代理对象,以后就可以通过这个Binder代理对象来和WindowManagerService服务进行通信了。
ActivityThread.handleResumeActivity()
↓
WindowManagerImpl.addView()
↓
WindowManagerGlobal.addView()
↓
new ViewRootImpl(view.getContext(), display)
↓
WindowManagerGlobal.getWindowSession()
↓
WindowManagerService.openSession()
↓
new Session(this, client, inputContext) //创建一个类型为Session的Binder本地对象,并且将这个类型为Session的Binder本地对象返回给应用程序进程
WindowState对象的创建过程:每一个Activity组件窗口在WindowManagerService服务内部都有一个对应的WindowState对象,用来描述它的窗口状态
ActivityThread.handleResumeActivity()
↓
WindowManagerImpl.addView()
↓
WindowManagerGlobal.addView()
↓
new ViewRootImpl()
ViewRoot.setView()
↓
Session.addToDisplay()
↓
WindowManagerService.addWindow()
↓
new WindowState()
mWindowMap.put(client.asBinder(), win) //把这个windowState保存起来
WindowState.attach() //继续调用前面所创建的一个WindowState对象的成员函数attach来创建一个关联的SurfaceSession对象,以便可以用来和SurfaceFlinger服务通信
↓
Session.windowAddedLocked()
↓
new SurfaceSession()