您的位置:首页 > 其它

Window的内部机制(添加,删除,更新)

2018-01-11 16:44 246 查看
Window是一个抽象的概念,每一个Window都对应一个View和ViewRootImpl,Window和View通过ViewRootImpl建立联系,Window以View的形式存在,这点从WindowManager的定义也可以看得出来,它提供三个接口方法都是针对View的,说明View才是Window的实体。

一. Window的添加过程

Window的添加过程通过WindowManager的addView 来实现的,WindowManager是一个接口,它的真正实现WindowManagerImpl类。具体操作如下:

@Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyDefaultToken(params);
mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}

@Override
public void updateViewLayout(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyDefaultToken(params);
mGlobal.updateViewLayout(view, params);
}

@Override
public void removeView(View view) {
mGlobal.removeView(view, false);
}


以上代码显示,WindowManagerImpl并没有直接实现Window的三大操作,而是全部交由WindowManagerGlobal来处理,WindowManagerGlobal实现addView主要分为以下几步

1.检查参数是否合法,如果是子Window还需要调整一些布局文件

2.创建ViewRootImpl并将View添加到列表中

WindowManagerGlobal中包含所有Window所对应View的列表,所有Window所对应ViewRootImlp的列表,所有Window对应的布局参数的列表,那些正在被删除的View的列表。然后在addView 的方法中,将Window的一系列对象放入列表中,具体代码如下:

private final ArrayList<View> mViews = new ArrayList<View>();
private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
private final ArrayList<WindowManager.LayoutParams> mParams =
new ArrayList<WindowManager.LayoutParams>();
private final ArraySet<View>
4000
; mDyingViews = new ArraySet<View>();

root = new ViewRootImpl(view.getContext(), display);

view.setLayoutParams(wparams);

mViews.add(view);
mRoots.add(root);
mParams.add(wparams);


3.通过ViewRootImpl来更新界面并完成Window的添加过程

这个步骤由ViewRootImpl的setView来完成,View的绘制过程是有ViewRootImpl来完成的,这里也不例外,在setView内部会通过requestLayout发起异步刷新请求。接着会通过WindowSession最终来完成Window的添加过程,它是一个Binder对象,真正地实现类是Session,Window的添加过程是一次IPC调用。Session内部会通过WindowManagerSevice来实现Window的添加

二.Window的删除过程

删除和添加是一样的过程,在WindowManager中提供两种接口removeView()和removeViewImmediate,标识同步删除和异步删除。

真正删除View的逻辑在dispatchDetachedFromWindow方法内部进行的,此方法主要做四件事情

1.垃圾回收工作,比如清除消息,移除和回调

2.通过Session删除Window

3.调用View的dispatchDetachWindow方法

4.调用WindowManagerGlobal的doRemoveView的方法刷新数据

三.Window的更新过程

更新Window的LayoutParams参数就行了,该过程除了View本身的重绘以外,ViewRootImpl还会通过WindowSession来更新Window 的视图,最终也是通过WindowManagerServeice的relayoutWindow来实现,也是IPC的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐