android ui机制的学习笔记

1,Activity中有一个DecorView;

2,DecorView是在PhoneWindow中;

2-1,PhoneWindow中有DecorView和mContentParent。mContentParent是DecorView或者是DecorView的子视图;

3,Activity的Window其实是它的导出类PhoneWindow。它的生成过程是:PolicyManager中有一个IPolicy接口,它引用了Policy实例,在Policy实例中使用makeNewWindow返回PhoneWindow;

4,DecorView是在PhoneWindow中new出来的;

5,WindowManagerService中有一个内部类Session,Session继承IWindowSession.Stub;

6,WindowManager是一个接口;

7,WindowManagerImpl实现了WindowManager这个接口;

7-1,WindowManagerImpl中组合了WindowManagerGlobal,而WindowManagerGlobal中有一个类型为ArrayList<ViewRootImpl>的成员mRoots;

7-2,ViewRootImpl中有一个ViewRootHandler,它继承Handler,接收了invalidate,resized等消息;

7-3,ViewRootImpl中有一个Surface成员对象,Surface中有一个Canvas字段。而View绘制使用的Canvas即是这个Surface中的Canvas;


10,在android高版本中,WindowManager的创建与获取是在ContextImpl的SYSTEM_SERVICE_MAP中实现的。SYSTEM_SERVICE_MAP是static的,所以推断一个app中只有一个WindowManagerImpl实例。

11,那么客户端app是如何跟WindowManagerService取得联系的呢?在客户端app这一边,有一个WindowManagerGlobal类,WindowManagerGlobal类中有一个静态方法getWindowSession,该静态方法返回一个IWindowSession接口。再看ViewRootImpl类的构造方法,在该构造方法中通过使用WindowManagerGlobal的getWindowSession静态方法,得到一个IWindowSession接口,赋给mWindowSession。这样可以使用mWindowSession和WindowManagerService建立通信;我发现我分析错了,应该是这样的。在客户端app这一边,有一个WindowManagerGlobal类,WindowManagerGlobal类有一个静态方法getWindowManagerService。通过getWindowManagerService获取到IWindowManager这个接口,并把它赋值给字段sWindowManagerService。那么问题来了,mWindowSession是什么作用呢?

11-1,window服务这一端有个Session类,它继承了IWindowSession.Stub,这个类的对象在WindowManagerService类的openSession方法中创建,并且通过远程机制把IWindowSession接口返回给客户端,具体是WindowManagerGlobal的getWindowSession方法中把服务器端的IWindowSession接口赋给静态字段sWindowSession。由此可见,一个app在WindowManagerService中对应一个Session对象;

11-2,在ViewRootImpl中有一个字段mWindow,它是W类。而这个W类是ViewRootImpl的静态内部类,它继承了IWindow.Stub,引用了ViewRootImpl和IWindowSession。这个W类的对象mWindow在ViewRootImpl的setView方法中以参数的形式传递给mWindowSession的addToDisplay。此时再来观察Window服务端,在Session中的addToDisplay方法中,调用了WindowManagerService的addWindow方法。而在后面这个addWindow方法中,把客户端这个W类的对象,以IWindow接口形式传给了WindowState,进而保存在WindowManagerService的队列中;

12,WindowManagerService继承了IWindowManager.Stub;

13,那么,WindowToken是什么呢?从WindowState开始研究起。WindowState的构造方法中传入了WindowToken;

14,在WindowManagerService中创建WindowState时,传入一个token,该token从mTokenMap中获得。而mTokenMap是一个Map表,该Map表的key是IBinder类,Value是WindowToken。该IBinder是WindowState中的mClient,这个mClient是接口IWindow,这个IWindow是客户端的W类。

15,在源代码中对WindowToken的解释如下所示。

/**
* Container of a set of related windows in the window manager.  Often this
* is an AppWindowToken, which is the handle for an Activity that it uses
* to display windows.  For nested windows, there is a WindowToken created for
* the parent window to manage its children.
*/

还有一些疑问列举如下:

1,Activity组件在启动完成后,会通过一个类型为Session的Binder对象来请求WindowManagerService为它创建一个类型为WindowState的对象,用来描述它的窗口状态。那么问题是:如何通过session请求WindowManagerService的?


activity的类图如下。

Activity中的window的类关系图如下。


猜你喜欢

转载自my.oschina.net/u/2291753/blog/471931