美文网首页
Android Activity ViewRootImpl Vi

Android Activity ViewRootImpl Vi

作者: uin_sisyphus | 来源:发表于2018-10-09 07:51 被阅读0次

    主要通过Activity的启动过程来看Activity,PhoneWindow,View,DecoView,ViewRootImpl这几者之间的关系

    view的绘制调用示意图

    来自Android开发艺术一书

    image.png

    View的绘制时序图:

    https://blog.csdn.net/u012439416/article/details/54563919 图中51,54处略有瑕疵,但不影响我们理解整个调用过程

    View的绘制时序图.png

    从Activity启动过程来看PhoneWindow,DecoView,ViewRootImpl,View的关系

    Activity启动之Window,Decoview,ViewRootImpl的关系.png
    1. 从Activity的启动过程可知,Activity 中创建了一个PhoneWindow(PhoneWindow是Android中唯一实现抽象类Window的类,除了Activity创建了PhoneWindow, 还有Dialog,和PhoneWindowManage)
      故一个Activtity至少拥有一个Window

    2. 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<WindowManager>() {
                @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
    

    可知WindowManagerService.java是实现部分

    思维导图.png

    延申:

    1. 其实, ViewRootImpl 的performTraversals方法调用2次, View的onMeasure方法至少调用2次, onLayout方法调用2次, onDraw方法调用1次。调用顺序如下
      https://blog.csdn.net/u012439416/article/details/54564306
    1. Window和surface,surfaceFlinger的关系?
      有时间得梳理下 Android窗口管理和SurfaceFlinger模块(貌似这两块都很复杂)
      Android窗口管理分析(3):窗口分组及Z-order的确定
      https://blog.csdn.net/happylishang/article/details/77893723

    相关文章

      网友评论

          本文标题:Android Activity ViewRootImpl Vi

          本文链接:https://www.haomeiwen.com/subject/wcgcaftx.html