窗口管理之窗口添加过程

窗口创建过程。
 窗口的添加流程简化如下,这里暂且忽略窗口的分组管理。
 APP首先去WMS登记窗口WMS端登记窗口APP新建Surface壳子,请求WMS填充Surface
 WMS请求SurfaceFlinger分配窗口图层SurfaceFlinger分配Layer,
 将结果回传给WMS, WMS将窗口信息填充到Surface传输到APP
 APP端获得填充信息,获取与SurfaceFlinger通信的能力
 
分在activity中创建窗口 和单独创建一个窗口。
final void handleResumeActivity(IBinder token,
    boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
    ...
    ViewManager wm = a.getWindowManager();
    //获得WindowManager,实际是WindowManagerImpl
    ...
    wm.addView(decor, l);
    //添加视图
    ...
    wm.updateViewLayout(decor, l);
    //需要刷新的时候会走这里
    ...
}

单独创建:先实例化view 再wms.addView(view, params)
在 WindowManagerGlobal 的 addView 中找到了如下代码。WindowManagerGlobal 提供与系统窗口管理器的低级别通信,用于与任何特定上下文无关的操作。
// WindowManagerGlobal.java
public void addView(View view, ViewGroup.LayoutParams params,
            Display display, Window parentWindow) {
            。。。
             //3.3以前是否添加过,就说明该View对象已经关联过ViewRoot和WindowManager.LayoutParams对象了
            int index = findViewLocked(view, false);
            if (index >= 0) {
                if (mDyingViews.contains(view)) {
                    // Don't wait for MSG_DIE to make it's way through root's queue.
                    mRoots.get(index).doDie();
                } else {
                    throw new IllegalStateException("View " + view
                            + " has already been added to the window manager.");
                }
                // The previous removeView() had not completed executing. Now it has.
            }

        // ……
        ViewRootImpl root;
        // ……//ViewRootImpl可以看做也是Window和View之间的通信的纽带,通过setView将视图添加到WMS,
//承担了每一个窗口与WindowManagerService进行交互、接收Input事件、界面绘制等重任。
        root = new ViewRootImpl(view.getContext(), display);
        view.setLayoutParams(wparams);
//三元组 view 在activity 中是顶层的DecorView。
 //3.4如果没有被关联过,addView就会创建一个ViewRootImpl对象,并且将它与view和params分别保存在数组mViews、mRoots和mParams的相同位置上
 在ViewRootImpl创建的时候,会获取到前面提到过过的一个关键对象Choreographer。Choreographer在一个线程中仅存在一个实例,因此在UI线程只有一个
 Choreographer存在。也就说,通常情况下,它相当于一个应用中的单例。
在ViewRootImpl初始化时,会实现一个Choreographer.FrameCallback(这是一个Choreographer中的内部类),
并向Choreographer中post。顾名思义,FrameCallback会在每次接收到Vsync信号时被回调。

        mViews.add(view);
        mRoots.add(root);当子view需要刷新时 需要找到根root节点来向下刷新
        mParams.add(wparams);


        // do this last because it fires off messages to start doing things
        try {
            root.setView(view, wparams, panelParentView);
        } catch (RuntimeException e) {
            ... final int index = findViewLocked(view, false);
                if (index >= 0) {
                    removeViewLocked(index, true);//异常产生 移除添加的view
                }
            }
            throw e;
        }
}
更新操作:
//4.1一般更新操作要更新数组mViews、mRoots和mParams的,再ro

你可能感兴趣的:(android,java,apache)