Skip to content

Latest commit

 

History

History
29 lines (15 loc) · 2.2 KB

File metadata and controls

29 lines (15 loc) · 2.2 KB

《Android开发艺术探索》第八章读书笔记

Window 是一个抽象类,它的具体实现类是 PhoneWindow。WindowManager 是外界访问 Window 的入口,Window 的具体实现位于 WindowManagerService 中,WindowManager 和 WindowManagerService 的交互是一种 IPC 过程。

Andorid 中所有的视图都是通过 Window 来呈现的,不管是 Activity、Dialog 还是 Toast,它们的视图实际上都是附加在 Window 上的。因此 Window 实际是 View 的直接管理者。

Window 和 WindowManager

WindowManager 所提供的功能很简单,常用的只有三个方法,即添加 View、更新 View和删除 View,这三个方法定义在 ViewManager 中,而 WindowManager 继承了 ViewManager。

如果想要删除一个 Window,那么只需要删除它里面的 View 即可。

Window 是一个抽象的概念,每一个 Window 都对应着一个 View 和 一个 ViewRootImpl,Window 和 View 通过 ViewRootImpl 来建立联系,因此 Window 并不是实际存在的,它是以 View 的形式存在的。

Dialog 的 Window 创建过程

  1. 创建 Window

  2. 初始化 DecorView 并将 Dialog 的视图添加到 DecorView

  3. 将 DecorView 添加到 Window 中并显示

Toast 的 Window 创建过程

Toast 也是基于 Window 来实现的,但是由于 Toast 具有定时取消这一功能,所以系统采用了 Handler。在 Toast 的内部有两类 IPC 过程,第一类是 Toast 访问 NotificationManagerService,第二类是 NotificationManagerService 回调 Toast 里的 TN 接口。

显示和隐藏 Toast 都需要通过 NMS 来实现,由于 NMS 运行在系统的进程中,所以只能过远程调用的方式来显示和隐藏 Toast。TN 是一个 Binder 类,在 Toast 和 NMS 进行 IPC 的过程中,当 NMS 处理的 Toast 的显示或隐藏请求时会跨进程回调 TN 中的方法,这个时候由于 TN 运行在 Binder 线程池中,所以需要通过 Handler 将其切换到当前线程中。这里的当前线程是指发送 Toast 请求所在的线程。

**注意:**由于这里使用了 Handler,所以意味着 Toast 无法在没有 Looper 的线程中弹出,这是因为 Handler 需要使用 Looper 才能完成切换线程的功能。