Android Framework解析——WMS原理_安卓 wms 专利

作者:bobby_developer

1. WMS原理:WMS角色与实例化过程

  • window:它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理。Window是View的容器,View是Window的具体表现内容;
  • windowManager:是一个接口类,继承自接口 ViewManager ,从它的名称就知道它是用来管理 Window 的,它的实现类为 WindowManagerImpl;
  • WMS:是窗口的管理者,它负责窗口的启动、添加和删除。另外窗口的大小和层级也是由它进行管理的;

SystemServer启动WMS流程表:

1.1 window

1.2 显示层级

1.3 窗口标志位

1.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON(当Window可见时允许锁屏)
2.FLAG_NOT_FOCUSABLE(Window 不能获得输入焦点,即不接受任何按键或按钮事件,例如该 Window 上 有 EditView,点击 EditView 是 不会弹出软键盘的,Window 范围外的事件依旧为原窗口处理;例如点击该窗口外的view,依然会有响应。另外只要设置了此Flag,都将会启用FLAG_NOT_TOUCH_MODAL) 3.FLAG_NOT_TOUCH_MODAL(设置了该 Flag,将 Window 之外的按键事件发送给后面的 Window 处理, 而自己只会处理 Window 区域内的触摸事件;Window 之外的 view 也是可以响应 touch 事件。 4.FLAG_NOT_TOUCHABLE(设置了该Flag,表示该 Window 将不会接受任何 touch 事件,例如点击该 Window 不会有响应,只会传给下面有聚焦的窗口) 5.FLAG_KEEP_SCREEN_ON(只要 Window 可见时屏幕就会一直亮着,视频播放、游戏) 6.FLAG_LAYOUT_NO_LIMITS(允许 Window 超过屏幕之外)
7.FLAG_IGNORE_CHEEK_PRESSES(当用户的脸贴近屏幕时(比如打电话),不会去响应此事件 )
8.FLAG_SHOW_WHEN_LOCKED(当用户的脸贴近屏幕时(比如打电话),不会去响应此事件
9.FLAG_IGNORE_CHEEK_PRESSES ; 窗口可以在锁屏的 Window 之上显示, 使用Activity#setShowWhenLocked(boolean) 方法代替)

1.4 WindowManager

在了解WindowManager管理View实现之前,先了解下WindowManager相关类图以及Activity界面各层级显示关系;

2. WMS工作原理

2.1 WMS职责

2.2 WMS中重要的一些属性释义

2.3 AddWindow源码分析

WMS中addWindow源码分析,在分析addWindow之前,先了解几个类;

  • WindowToken

WindowToken具有令牌的作用,是对应用组件的行为进行规范管理的一个手段。WindowToken由应用组件或其管理者负责向WMS声明并持有。应用组件在需要新的窗口时,必须提供WindowToken以表明自己的身份,并且窗口的类型必须与所持有的WindowToken的类型一致,同时它将属于同一个应用组件的窗口组织在了一起;

  • DisplayContent

如果说WindowToken按照窗口之间的逻辑关系将其分组,那么DisplayContent则根据窗口的显示位置将其分组。隶属于同一个DisplayContent的窗口将会被显示在同一个屏幕中。每一个DisplayContent都对应这一个唯一的ID,在添加窗口时可以通过指定这个ID决定其将被显示在那个屏幕中。DisplayContent是一个非常具有隔离性的一个概念。处于不同DisplayContent的两个窗口在布局、显示顺序以及动画处理上不会产生任何耦合。因此,就这几个方面来说,DisplayContent就像一个孤岛,所有这些操作都可以在其内部独立执行。因此,这些本来属于整个WMS全局性的操作,变成了DisplayContent内部的操作了。

  • WindowState 表示一个窗口的所有属性,所以它是WMS中事实上的窗口;当向WMS添加一个窗口时,WMS会为其创建一个WindowState。另外WMS.addWindow()函数中看到新的WindowState被保存到mWindowMap中,键值为IWindow的Bp端。mWindowMap是整个系统所有窗口的一个全集。

2.4 removeWindow

void removeWindow(Session session, IWindow client) {
         synchronized (mGlobalLock) {
                //获取WindowState
             WindowState win = windowForClientLocked(session, client, false);
             if (win != null) {
                 //执行删除
                 win.removeIfPossible();
                 return;
             }
         // Remove embedded window map if the token belongs to an embedded window
         mEmbeddedWindowController.remove(client);
     }
 }

win.removeIfPossible方法和它的名字一样, 并不是直接执行删除操作,而是进行多个条件判断过滤,满足其中一个条件就会return,推迟删除操作。比如View正在运行一个动画,这是就会推迟删除操作直到动画完成。然后调用removeImmediately方法。

3. 事件派发

EventHub:
1.使用inotify监听输入设备的添加和移除;
2.使用epoll机制监听输入设备的数据变化;
3.读取设备文件数据;
4.将原始数据返回给InputReader;

InputReader:不断读取由EventHub监听到的input事件,将多个事件组合成一个可供上层消费的事件(比如将一组触摸事件合并成一个action_down事件),然后交给InputDispatcher进行事件分发;

InputDispatcher:拿到InputReader获取的事件后,对事件进行包装,寻找并分发到目标窗口,对应inputChannel输入;

Android系统是由事件驱动的,而input是常见的事件之一,点击、滑动、长按等操作,都属于input事件,核心类就是InputReader和InputDispatcher;

解释: ViewRootImpl#WindowInputEventReceiver:从下面源码可以看出,此类用于InputChannel输入事件接收以及处理输入事件分发;

    final class WindowInputEventReceiver extends InputEventReceiver {
        //构造方法,接受inputchannel输入事件
         public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) {
             super(inputChannel, looper);
         }
 
    
    @Override
     public void onInputEvent(InputEvent event) {
        ...
         if (processedEvents != null) {
             if (processedEvents.isEmpty()) {
                 // InputEvent consumed by mInputCompatProcessor
                 finishInputEvent(event, true);
             } else {
                 for (int i = 0; i < processedEvents.size(); i++) {
                    //对输入事件进行分发
                     enqueueInputEvent(
                             processedEvents.get(i), this,
                             QueuedInputEvent.FLAG_MODIFIED_FOR_COMPATIBILITY, true);
                 }


## 最后

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。

**技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;**

 > 我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

>![](https://img-blog.csdnimg.cn/img_convert/c3cba1d6b4f07258ae7fb7ee4ab21f0e.webp?x-oss-process=image/format,png)

 **Java语言与原理;**
大厂,小厂。Android面试先看你熟不熟悉Java语言

> ![](https://img-blog.csdnimg.cn/img_convert/e3fd54aa4f24d90bb5faa7be46005968.webp?x-oss-process=image/format,png)

**高级UI与自定义view;**
自定义view,Android开发的基本功。

> ![](https://img-blog.csdnimg.cn/img_convert/4aee42752f032dc842abffe63fb820a7.webp?x-oss-process=image/format,png)

**性能调优;**
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

> ![](https://img-blog.csdnimg.cn/img_convert/2dbf7ddba6500f1f3b9f9a7daab5734c.webp?x-oss-process=image/format,png)

**NDK开发;**
未来的方向,高薪必会。

> ![](https://img-blog.csdnimg.cn/img_convert/beeca54e42a8f0e266db926df4299d0c.webp?x-oss-process=image/format,png)

**前沿技术;**
组件化,热升级,热修复,框架设计

> ![](https://img-blog.csdnimg.cn/img_convert/d45f27945789378e0bed272bd93dfb42.webp?x-oss-process=image/format,png)

> 网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

**不出半年,你就能看出变化!**




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值