Android|Android Activity ViewRootImpl View Window 关系梳理
主要通过Activity的启动过程来看Activity,PhoneWindow,View,DecoView,ViewRootImpl这几者之间的关系view的绘制调用示意图
来自Android开发艺术一书
文章图片
image.png View的绘制时序图:
https://blog.csdn.net/u012439416/article/details/54563919 图中51,54处略有瑕疵,但不影响我们理解整个调用过程从Activity启动过程来看PhoneWindow,DecoView,ViewRootImpl,View的关系
文章图片
View的绘制时序图.png
文章图片
Activity启动之Window,Decoview,ViewRootImpl的关系.png
- 从Activity的启动过程可知,Activity 中创建了一个PhoneWindow(PhoneWindow是Android中唯一实现抽象类Window的类,除了Activity创建了PhoneWindow, 还有Dialog,和PhoneWindowManage)
故一个Activtity至少拥有一个Window
- setWindowManager设置的windowManager是哪个类呢?
//Activity.java中的的attch方法中
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
//注册的地方frameworks/base/core/java/android/app/SystemServiceRegistry.java
registerService(Context.WINDOW_SERVICE, WindowManager.class,
new CachedServiceFetcher() {
@Override
public WindowManager createService(ContextImpl ctx) {
return new WindowManagerImpl(ctx);
}});
//看下WindowManagerImpl类
//SystemSerever.java
wm = WindowManagerService.main(context, inputManager,
mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
!mFirstBoot, mOnlyCore, new PhoneWindowManager());
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
//-------------------------
//IWindowManager.aidl
//frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
public class WindowManagerService extends IWindowManager.Stub
【Android|Android Activity ViewRootImpl View Window 关系梳理】可知WindowManagerService.java是实现部分
文章图片
思维导图.png 延申:
- 其实, ViewRootImpl 的performTraversals方法调用2次, View的onMeasure方法至少调用2次, onLayout方法调用2次, onDraw方法调用1次。调用顺序如下
https://blog.csdn.net/u012439416/article/details/54564306
- Window和surface,surfaceFlinger的关系?
有时间得梳理下 Android窗口管理和SurfaceFlinger模块(貌似这两块都很复杂)
Android窗口管理分析(3):窗口分组及Z-order的确定
https://blog.csdn.net/happylishang/article/details/77893723
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备