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类。具体操作如下:
以上代码显示,WindowManagerImpl并没有直接实现Window的三大操作,而是全部交由WindowManagerGlobal来处理,WindowManagerGlobal实现addView主要分为以下几步
1.检查参数是否合法,如果是子Window还需要调整一些布局文件
2.创建ViewRootImpl并将View添加到列表中
WindowManagerGlobal中包含所有Window所对应View的列表,所有Window所对应ViewRootImlp的列表,所有Window对应的布局参数的列表,那些正在被删除的View的列表。然后在addView 的方法中,将Window的一系列对象放入列表中,具体代码如下:
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的过程。
一. 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的过程。
相关文章推荐
- android 源码剖析之------Window的内部实现机制(添加、删除、更新)
- 我眼中的Window创建/添加/删除/更新过程
- 关于Window和WindowManager的一点愚见(添加,删除,更新)
- MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB 性能监测
- 步步为营VS 2008 + .NET 3.5(8) - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除
- MS SQL Server 无法添加、更新或删除从msx服务器上发起的作业(或其步骤或调度)
- js实现对table动态添加、删除和更新的方法
- Moodle: 查询 / 更新 / 添加 / 删除 / 导出 用户 ($DB用法
- Struts2+Ibatis+Spring.30(完整例子,含3.0事务配置,OSCache缓存配置,JreeChart配置,log4j日志输出Sql,对一个表实现完整的查询,批量删除,添加,更新)
- c#中access数据库的更新,删除,添加
- SQLite数据库存储(创建、添加、更新、删除、查询)
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新
- 如何查看、添加、修改、删除电脑内部路由
- 添加删除WINDOW组件不能使用的问题解决
- 步步为营VS 2008 + .NET 3.5(10) - DLINQ(LINQ to SQL)之调用存储过程的添加、查询、更新和删除
- Linux:yum(添加/删除/更新RPM包)的详细使用方法
- 稳扎稳打Silverlight(57) - 4.0通信之WCF RIA Services: 概述, 通过 DomainDataSource 实现数据的添加、查询、更新和删除操作
- 稳扎稳打Silverlight(57) - 4.0通信之WCF RIA Services: 概述, 通过 DomainDataSource 实现数据的添加、查询、更新和删除操作
- 动态给表添加删除字段并同时修改它的插入更新存储过程