Activity完成和AMS的绑定并走到Activity生命周期的onCreate-onResume后的界面显示过程是怎样的?
首先分析下在界面显示过程中主要类之间的关系。
- Window是一个抽象类,通过控制DecorView提供了一些标准的UI方案,比如背景、标题、虚拟按键等,而PhoneWindow是Window的唯一实现类,在Activity创建后的attach流程中创建,应用启动显示的内容装载到其内部的mDecor(DecorView);
- DecorView是整个界面布局View控件树的根节点,通过它可以遍历访问到整个View控件树上的任意节点;
- WindowManager是一个接口,继承自ViewManager接口,提供了View的基本操作方法;WindowManagerImp实现了WindowManager接口,内部通过组合方式持有WindowManagerGlobal,用来操作View;WindowManagerGlobal是一个全局单例,内部可以通过ViewRootImpl将View加至窗口中;
- ViewRootImpl是所有View的Parent,用来总体管理View的绘制以及与系统WMS窗口管理服务的IPC交互从而实现窗口的开辟;ViewRootImpl是应用进程运转的发动机,可以看到ViewRootImpl内部包含mView(就是DecorView)、mSurface、Choregrapher,mView代表整个控件树,mSurfacce代表画布,应用的UI渲染会直接放到mSurface中,Choregorapher使得应用请求vsync信号,接收信号后开始渲染流程;
交互流程
- Activity.onCreate.attach阶段:实例化Window(PhoneWindow),绑定WindowManager(WindowManagerImpl-WindowManagerGlobal)
- Actiivty.onCreate.setContentView阶段:绑定Window(PhoneWindow)和View(DocorView)
- Activity.onResume阶段一:WindowManager.addView,实例化ViewRootImpl,通过ViewRootImpl.setView绑定ViewRootImpl和DecorView
- Actiivty.onResume阶段二:WindowManager.addView,绑定WindowManagerImpl、WindowManagerGlobal、DecorView、ViewRootImpl四者的关系