Android进阶知识树——理解系统服务WindowManagerService

本文详细介绍了WindowManagerService(WMS)的功能,包括窗口管理、动画管理、输入管理和Surface管理。阐述了WMS的创建过程,从SystemServer.main()开始,通过DisplayThread和BlockingRunnable确保线程安全。接着,分析了窗口的添加流程,从权限检查、窗口类型确定到WindowToken的创建。最后,简要提及了窗口的删除过程,主要涉及WindowState的清理工作。
摘要由CSDN通过智能技术生成

1、WMS

  • WMS主要功能
  1. 窗口管理:WMS负责整个系统窗口的启动、添加、删除工作,系统中每个程序的显示都由WMS管理
  2. 窗口动画管理:WMS负责窗口添加或切换时动画效果的执行
  3. 窗口输入管理:WMS负责对窗口的触摸事件进行反馈和处理
  4. Surface管理:每个Window都有对应的Surface负责窗口的显示,而WMS负责所有Surface的管理调度
  • WMS属性介绍
public class WindowManagerService extends IWindowManager.Stub
        implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {
   

    final WindowManagerPolicy mPolicy;
    final ArraySet<Session> mSessions = new ArraySet<>();
    final WindowHashMap mWindowMap = new WindowHashMap();
    final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<>();
    final H mH = new H();
    final WindowAnimator mAnimator;
    final InputManagerService mInputManager;
    final IActivityManager mActivityManager;
}
  1. mPolicy:WindowManagerPolicy的实例,WindowManagerPolicy是窗口管理策略的接口类,它的具体实现类为PhoneWindowManager
  2. mSessions:ArraySet对象,保存元素类型为Session,主要用于应用程序与WMS间的进程通信,每个应用程序对应一个Session,WMS内部保存这些Session,用来记录所有像WMS提出窗口服务的客户端
  3. mWindowMap:WindowHashMap对象,它内部以IBinder为Key,WindowState为Value,所以mWindowMap中保存着WMS中所有窗口的集合,而WindowState中保存着每个窗口的所有信息;
  4. mFinishedStarting:ArrayList对象,内部保存着已经启动窗口的WindowToken,WindowToken为窗口令牌,当程序像WMS申请创建Window时需要出具Token,程序中的每个Activity对应一个AppWindowToken(WindowToken的子类),WindowToken会将统一Actiivty的窗口组合在一起进行管理;
  5. mAnimator:WindowAnimator的对象,用于窗口的动画管理
  6. mH:H的实例,负责将任务添加到主线程中
  7. mInputManager:InputManagerService对象负责输入系统的管理,对窗口的触摸事件反馈和处理
  8. mActivityManager:内部保存AMS的对象

2、创建过程

由Android进程的启动过程知道,程序会同过JNI调用ZygiteInit.main()进入Java层,在main()方法中完成启动工作,其中重要的一步就是调用startSystemServer()启动系统服务,WMS就是其中一个系统服务,startSystemServer()使用反射最终调用SystemServer.main()方法(本文源码参照Android P),

public static void main(String[] args) {
   
       new SystemServer().run();
   }
 private void run() {
   
 mSystemServiceManager = new SystemServiceManager(mSystemContext);
 startBootstrapServices();
 startCoreServices();
 startOtherServices();
 }

在main方法中直接调用SystemService的run(),在run中首先创建SystemServiceManager对象,然后利用SystemServiceManager分别启动引导服务、核心服务、其他服务,WMS的启动就在startOtherServices()过程中;

  • startOtherServices()
inputManager = new InputManagerService(context);
 wm = WindowManagerService.main(context, inputManager,
       mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
       !mFirstBoot, mOnlyCore, new PhoneWindowManager());
 ServiceManager.addService(Context.WINDOW_SERVICE, wm, false<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值