Builder模式- WM - 图1

AlertDialog

注意:
基于SDK28-android/app包下的AlertDialog,非AndroidX/Support包下的。
AlertDialog使用Builder来构建,通过Builder组装Dialog零件,如title,message,buttons等。 Builder模式- WM - 图2AlertDialg使用Dailog的show,show函数做了哪些事情?

  • 通过dispatchOnCreate方法调用AlertDialog的onCreate函数
  • 调用AlertDialog的onStart函数
  • 将Dialog的DecorView添加到WindowManager中

将DecorView添加到WindowManager中,这句话在很多场景会用到。
如:Activity的onResume函数;Dialog的show函数。

🤔思考:

  • 如果在Service中showDialog会发生什么情况?
  • Activity中showDialog会不会影响Activity生命周期?参考点这里

WindowManager

Builder模式- WM - 图3通过Context.getSystemService()方法获取WindowManager,各种系统服务注册到ContextImpl的map容器中,通过该服务的字符串Key获取

@SystemService(Context.WINDOW_SERVICE)
public interface WindowManager extends ViewManager {}

@UiContext
public static final String WINDOW_SERVICE = “window”;

获取WindowManager实例:

WindowManager wManager = getApplicationContext().getSystemService(Context. WINDOW_ SERVICE);

WindowManagerGlobal.addView()

  • 构建ViewRootImpl
  • 将布局参数设置给View
  • 存储这些ViewRootImpl,View,LayoutParam到列表中
  • 通过ViewRootImpl的setView将View显示到窗口中

ViewRootImpl
是Framework层与Native层的通信桥梁。

ViewRootImpl.setView()

  • requestLayout
  • 向WMS发起显示当前Window请求

ViewRootImpl.performTraversals()

  • 获取Surface对象,用于图像绘制
  • performMeasure,测量视图树View大小
  • performLayout,布局整个视图树
  • performDraw,绘制整颗视图树

ViewRootImpl.performDraw

  • 判断是使用CPU绘制还是GPU绘制
  • 获取绘制表面Surface对象
  • 通过Surface对象获取并且锁住Canvas对象
  • 从DecorView开始发起整颗树的绘制流程
  • Surface对象锁住Canvas,并且通知SurfaceFlinger更新视图

Binder在WindowManager中的运用

UML简化版

Builder模式- WM - 图4

动手实践之WindowManager运用

Android 使用WindowManager实现悬浮窗及源码解析

WindowManager设计模式

桥接模式


其他开源库中使用到的Builder

Retrofit