AlertDialog
注意:
基于SDK28-android/app包下的AlertDialog,非AndroidX/Support包下的。
AlertDialog使用Builder来构建,通过Builder组装Dialog零件,如title,message,buttons等。
AlertDialg使用Dailog的show,show函数做了哪些事情?
- 通过dispatchOnCreate方法调用AlertDialog的onCreate函数
- 调用AlertDialog的onStart函数
- 将Dialog的DecorView添加到WindowManager中
将DecorView添加到WindowManager中,这句话在很多场景会用到。
如:Activity的onResume函数;Dialog的show函数。
🤔思考:
- 如果在Service中showDialog会发生什么情况?
- Activity中showDialog会不会影响Activity生命周期?参考点这里
WindowManager
通过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简化版

动手实践之WindowManager运用
Android 使用WindowManager实现悬浮窗及源码解析
