Framework底层服务WMS——深扒WindowManager管理机制
2024-04-29 05:08:22 点击:393
一、层服WMS功能介绍
要想了解WindowManager管理机制,深扒首先我们先介绍WMS是理机一个非常重要的系统服务。
它支撑着视图相关的层服各项业务,这非常符合软件设计的深扒单一职责原则,其业务和ActivityManagerService(简称AMS)一起几乎占据了framework业务的理机半壁江山
,可见其重要性。层服关于WMS的深扒内容实在太多了,这里只简单介绍其大致功能以及启动流程。理机
WMS的层服大概功能如下图所示
:
这里先简单描述一下各项功能:
- 窗口管理 :WMS是窗口管理者,结合WindowManager实现窗口的深扒启动 、添加 、理机删除,层服以及管理窗口的深扒大小、层级等 。理机
- 窗口动画:在窗口切换时,使用窗口动画可以使这个过程看起来更炫更生动
,这个窗口动画就是由WMS的动画子系统来负责的
,动画子系统的管理者便是WindowAnimator。
- 输入系统的中转站:触摸设备屏幕上的窗口时会产生触摸事件
,InputManagerService(IMS)会对触摸事件进行处理,找到最合适的窗口来反馈事件 。而WMS是这些窗口的管理者 ,那自然而然就成为了输入系统的中转站了
。
- Surface管理 :窗口并不具备绘制功能,所以每个窗口都需要一个Surface来供自己绘制
,WMS就是这个Surface的管理者。
二、windowManager简介
windowManager是Android的系统服务SystemService中的重要一员,用于将View动态添加
、移除、更新到window中。
3个方法
// 添加viewnpublic void addView(View view, ViewGroup.LayoutParams params);nn// 更新viewnpublic void updateViewLayout(View view, ViewGroup.LayoutParams params);nn// 移除npublic void removeView(View view);
两要素
View
需要有一个被添加的View。
WindowManager.LayoutParams
WindowManager.LayoutParams也是ViewGroup.LayoutParams的一个子类 。 WindowManager.LayoutParams的参数type指定了window的类型
,包括如下三种类型:
- Application windows(值从1~99)
,该类型window的token必须被设置成activity的token(token:标识一个window)。应用内的一些小浮球就是该类型window 。
- Sub-windows(值从1000~1999),它关联于另一个顶级的window,该类型window的token必须是关联window的token。对话框就是该类型的window。
- System windows(值为2000~2999) ,该类型的window通常是系统因特殊目的所使用的,不应该被普通应用所使用,且使用需要申请指定的权限(系统权限中的悬浮窗权限) 。系统的通知栏就是该类型window。
WindowManager.LayoutParams的参数flags用于设置各种行为
,比如:
- 状态栏透明(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
- 导航栏透明(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
- 不获取焦点(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)(注意:如果设置该属性,window通过setOnKeyListener监听back事件会无效)
- 不响应触摸事件(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
如果要对系统UI进行设置,可以通过WindowManager.LayoutParams的参数systemUiVisibility