2019独角兽企业重金招聘Python工程师标准>>>

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

转载于:https://my.oschina.net/u/2291753/blog/471931

android ui机制的学习笔记相关推荐

  1. Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  2. Android日常开发 - FlexboxLayout学习笔记

    Android日常开发 - FlexboxLayout学习笔记 Android日常开发使用FlexboxLayout实现流式布局的效果,FlexboxLayout与h5中的flex使用十分相似,都是将 ...

  3. Android Studio下载搭建学习笔记01

    Android Studio下载搭建学习笔记01 下载Android Studio 安装Android Studio 进入安装向导 选择安装组件 选择安装位置 选择文件菜单 等待安装 启动并配置And ...

  4. Android高级终端开发学习笔记(《疯狂Android讲义》第2章-第10章)

    Android疯狂讲义前10章知识点总结 /-------------------------10-31号晚上学习笔记----------------------------/ 在设置了最小支持版本为 ...

  5. Android开发艺术探索学习笔记 第二章IPC

    最近将之前工作做本地的学习笔记上传一下 这里是Android艺术开发探索的前三章内容 文章目录 1. android的多进程模式 2. IPC基础概念介绍 2.1 Serializable 2.2Pa ...

  6. Android高级终端开发学习笔记(《疯狂Android讲义》第11章-第17章)

    Android高级终端开发笔记 2021/6/19 下午 13:34开始 多媒体应用开发 Android支持的音频格式有:MP3 WAV 3GP等.支持的视频格式有MP4 3GP等. 多媒体数据既可以 ...

  7. atomic原子类实现机制_JUC学习笔记--Atomic原子类

    Atomic 原子操作类包 Atomic包 主要是在多线程环境下,无锁的进行原子操作.核心操作是基于UnSafe类实现的CAS方法 CAS CAS: compareAndSwap :传入两个值:期望值 ...

  8. Composite UI Application Block学习笔记之Event Broker

    Composite UI Application Block着重于将应用逻辑和界面分开,让应用系统具备更清晰的结构,更强的扩展性.可移植性.在曹严明先生的讲座中,提及到了关于应用CAB开发的几个指导性 ...

  9. 我的Android进阶之旅------gt;Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  10. [Android]Android P(9) WIFI学习笔记 - HAL (1)

    目录 前文回顾 前言 入口 WifiNative 初始化 打开WIFI IWifiChip IWifiCond ISupplicant 前文回顾 WIFI学习笔记 - Framework (1) WI ...

最新文章

  1. linux rpm目录,Linux修改RPM的安装目录的方法
  2. Apache安装80端口被占用解决方案
  3. 南京秦淮灯会亮灯迎春 明城墙内外“飘”年味
  4. 用google mock模拟C++对象
  5. java例子:数组 数3退1
  6. SpringCloud Gateway 快速入门_01
  7. oracle 怎么读取表结构和注释,生成数据库结构文档
  8. tcl脚本直接执行脚本中中文识别不了的处理
  9. Magicodes.Admin.Core开源框架总体介绍
  10. 异常处理简单例子--python except Exception as e
  11. java 子类型_Java – 基类和子类中的equals方法
  12. 人人商城小程序总是弹出“百度未授权使用地图API”的解决方法
  13. win10MATLAB如何完全卸载,怎么完全卸载cad_win10彻底卸载cad的图文步骤-系统城
  14. PD协议诱骗取电XSP01支持Type-C 5V9V12V15V20V原理图
  15. Edison编译时显示No such file or directory
  16. Maya模型锁定不能编辑的解锁方法
  17. AtCoder Grand Contest 021完整题解
  18. 学计算机颈椎,长期玩电脑颈椎病
  19. Caffe中的损失函数
  20. python爬取万方数据库,爬虫获取 js 动态数据 (万方数据库文献下载)

热门文章

  1. ssh无密码登录设置
  2. 软件2班36人[扑林作]
  3. Mac Android studio 修改历史查看
  4. python 3 导入 迭代判断
  5. 微信小程序开发基础知识总结
  6. 机器学习笔记(1)决策树
  7. 035 spring amqp
  8. CentOS 6.3 配置 yum
  9. IE6和IE7的line-height和现代浏览器不一致的问题
  10. 自动垃圾回收学习笔记-垃圾回收算法