理解Window的添加,删除,刷新内部机制

news/2024/7/5 6:42:26

添加一个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://www.niftyadmin.cn/n/1999057.html

相关文章

mysql负载均衡 监控_使用HAProxy对MySQL进行负载均衡和状态监控

使用HAProxy对MySQL进行负载均衡和状态监控转载请保留原文内容,并声明转载地址:http://www.doczj.com/doc/e23a311eff00bed5b9f31de0.html/blog/1284.html乐搜(http://www.doczj.com/doc/e23a311eff00bed5b9f31de0.html)使用HAProxy已经很久了&#xff0…

简短介绍_螺杆泵知识介绍,简短不缺精华。

1、螺杆泵(screw pump)螺杆泵是按迥转啮合容积式原理工作的新型泵种,其主要工作部件是偏心螺杆(转子)和固定的衬套(定子)。由于定子和转子的特殊几何形状,分别形成单独的密封容腔,介质在轴向被均匀推行流动,内部流速低&#xff0c…

如何实现开关CD-ROM

对CD-ROM的操作,可通过mciSendCommand函数实现。 下面是用VC实现的代码: // 设备ID DWORD wDevID; // 打开设备参数 MCI_OPEN_PARMS mciOM; // 将设备名称设为CD_ROM mciOM.lpstrDeviceType "cdaudio"; // 将此设备…

mysql如何用sql添加字段如何设置字符集和排序规则

alter table pay_company add sms_code2 varchar(16) CHARACTER SET UTF8 COLLATE utf8_general_ci DEFAULT null;转载于:https://www.cnblogs.com/YuyuanNo1/p/8315968.html

python装b代码_Python十大装B语法

Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战…

owl java_使用 OWL API 推理本体

我使用 OWL API 4.1.3 来加载我的本体并不大。由于我需要使用推断信息,我还使用 Hermit 1.3.8.413 库进行推理。以下代码显示了我是如何完成它的。public class ReasonRDF {public static void main(String[] args) throws OWLOntologyCreationException, OWLOntolo…

探索NTFS

探索NTFS WebCrazy(tsu00263.net) NTFS是Windows NT引入的新型文件系统,它具有许多新特性。本文旨在探索NTFS的底层结构,所叙述的也仅是文件在NTFS卷上的分布。NTFS中,卷中所有存放的数据均在一个叫$MFT的文件中&#xf…

python上位机串口发送数据给51单片机_请问单片机串口如何接收上位机不断发送的数据帧并将该帧的有效数据提取出来?...

2018-8-29 11:16我编写的主程序中LED无法点亮,硬件电路核查过没问题,void Data_anlysize()函数也没问题,Data_ok能收到,不清楚问题在哪? #include "reg52.h" //此文件中定义了单片机…