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的类关系图如下。


更多相关文章

  1. Android(安卓)SystemUI分析
  2. android 在adapter中更改Activity中的数据 (自定义接口)
  3. android post数据到服务器端工具类(包括postjson字符串、键值对)
  4. 方法选择Android从SD卡中选择图片的三种方法及自定义系统选择框
  5. Android(安卓)- Looper / Handler / Message
  6. Android(安卓)传感器(Sensor)API教程 (二) 传感器事件
  7. Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  8. Android添加(创建)、删除及判断是否存在桌面快捷方式的方法
  9. Android-SQLite数据库使用方法

随机推荐

  1. android The project target (Android 2.
  2. Android XML布局文件优化
  3. Android WebView中javascript和java的互
  4. usbmanger android 底下USB的工作模式
  5. Android 颜色和颜色透明度列表
  6. 第四章 Android开发三大基石—Activity、
  7. Android Touch 触摸事件
  8. android 播放rtsp协议流媒体
  9. Android Studio 使用二三事----' ' canno
  10. Android中SharedPreferences的使用(登陆,