博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解Window的添加,删除,刷新内部机制
阅读量:6320 次
发布时间:2019-06-22

本文共 1351 字,大约阅读时间需要 4 分钟。

添加一个window示例(代码示例参考任玉刚的安卓艺术探索)

WindowManager是外界访问window的入口,window的具体实现位于WindowManagerService中,windowManager和WinowManagerService的交互是一个IPC过程.

window是一个抽象的概念,每个window都对应一个View和ViewRootImpl,window和View通过ViewRootImpl来建立联系的。从源码看WindowManager是继承ViewManager,所以window的具体表现形式是view。

window的添加过程

从源码看,WindowManager是一个接口,真正实现window的添加,更新,删除由WindowManagerImpl类,WindowManagerImpl委托WindowManagerGlobal具体实现

分析源码:

WindowManagerGlobal addView内部核心代码

在addView方法里,会创建ViewRootImpl对象,由ViewRootImpl的对象处理重新布局和完成window的添加,scheduleTraversals()是view绘制入口。

ViewRootImpl类setView方法核心代码:

在系统接收任何事情之前执行重新布局。

由IWindowSession完成Window的添加,IWindowSession是一个AIDL接口,通过Session实现,Session最终交由WindowManagerService实现,WindowManagerService,Session都是Binder,由此可见Window的添加是一个IPC交互的过程。

window的删除

由源码看,Window的删除也是WindowManagerGlobal类实现。

removeViewLocked方法里面会创建ViewRootImpl,由viewRootImpl的最终由doDie方法去删除, die的结果返回表示为true的时候将待删除的viewm放到DyingViews稍后删除。

View的删除逻辑dispatchDetachedFromWindow方法里面,删除window以后,调用WindowManagerGlobal的doRemoveView方法清空mRoots,mParams,mDyingViews。

dispatchDetachedFromWindow方法里面首先调用mView.dispatchDetachedFromWindow()的方法,当view从window分离后调用onDetachedFromWindow,表示view不在被绘画,可以在这个方法内部做一些资源的回收工作,重写时候必须要调用super方法。

由IWindowSession完成Window的删除,IWindowSession是一个AIDL接口,通过Session实现,Session最终交由WindowManagerService实现

Window的刷新过程

由源码看,Window的刷新也是WindowManagerGlobal类实现。

就是更新WindowManager.LayoutParams。

转载地址:http://yhcaa.baihongyu.com/

你可能感兴趣的文章
Oracle 连接、会话数的查看,修改
查看>>
Oracle 11g password过期被锁定报道 ORA-28000 the account is locked
查看>>
轨磁条简介
查看>>
NSQ部署
查看>>
大厂前端高频面试问题与答案精选
查看>>
如何设计高扩展的在线网页制作平台
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>
React Native最佳学习模版- F8 App开源了
查看>>
云服务正在吞噬世界!
查看>>
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>
Android 类库书签更新(一)
查看>>