Android系统服务:WMS、AMS相关知识

简介: 参考文献Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析Android窗口管理服务WindowManagerService对输入法窗口(Input Method Window)的管理分析Android窗口管理服务WindowManagerService显示窗口动画的原理分析

简介
AMS
WMS
什么是Window
View
简介
可以说Android的framework层主要是由AMS、WMS、View所构成,这三个模块穿插交互在整个framework中,本编文章作为初步学习的笔记。

Activity与WIndow
Activity只负责生命周期和事件处理
Window只控制视图
一个Activity包含一个Window,如果Activity没有Window,那就相当于Service

AMS与WMS
AMS统一调度所有应用程序的Activity
WMS控制所有Window的显示与隐藏以及要显示的位置

AMS(activity manaer service):
AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。

作用

统一调度所有应用程序的Activity的生命周期
启动或杀死应用程序的进程
启动并调度Service的生命周期
注册BroadcastReceiver,并接收和分发Broadcast
启动并发布ContentProvider
调度task
处理应用程序的Crash
查询系统当前运行状态
代理模式

WMS(window manager service)
WindowManagerService服务的实现是相当复杂的,毕竟它要管理的整个系统所有窗口的UI,而在任何一个系统中,窗口管理子系统都是极其复杂的。(控制所有的window的显示、隐藏及要显示的问题。)
作用:

为所有窗口分配Surface。客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Surface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。
管理Surface的显示顺序、尺寸、位置
管理窗口动画
输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中,完成这一工作不在话下。
桥接模式

什么是Window
“Window即窗口的意思,窗口是一个抽象的概念,从用户的角度来讲,它是一个界面;从SurfaceFlinger的角度来看,它是一个Layer,承载着和界面有关的数据和属性;从WMS角度来看,它是一个WIndowState,用于管理和界面有关的状态。

在《深入理解Android内核设计思想》一书中看到一个比喻非常好,整个界面就像由N个演员参与的话剧:SurfaceFling是摄像机,它只负责客观的捕捉当前的画面,然后真实的呈现给观众;WMS就是导演,它要负责话剧的舞台效果、演员站位;ViewRoot就是各个演员的长相和表情,取决于它们各自的条件与努力。可见,WMS与SurfaceFling的一个重要区别就是——后者只做与“显示”相关的事情,而WMS要处理对输入事件的派发。

Android支持的窗口类型很多,统一可以分为三大类,另外各个种类下还细分为若干子类型,且都在WindowManager.java中有定义。

Application Window
SystemWindow
Sub Window
View
工作流程 AMS的工作流程,其实就是Activity的启动和调度的过程,所有的启动方式,最终都是通过Binder机制的Client端,调用Server端的AMS的startActivityXXX()系列方法。所以可见,工作流程又包括Client端和Server端两个。

Client端流程

Launcher主线程捕获onClick()点击事件后,调用Launcher.startActivitySafely()方法。Launcher.startActivitySafely()内部调用了Launcher.startActivity()方法,Launcher.startActivity()内部调用了Launcher的父类Activity的startActivity()方法。
Activity.startActivity()调用Activity.startActivityForResult()方法,传入该方法的requestCode参数若为-1,则表示Activity启动成功后,不需要执行Launcher.onActivityResult()方法处理返回结果。
启动Activity需要与系统ActivityManagerService交互,必须纳入Instrumentation(检测,插装)的监控,因此需要将启动请求转交instrumentation,即调用Instrumentation.execStartActivity()方法。
Instrumentation.execStartActivity()首先通过ActivityMonitor检查启动请求,然后调用ActivityManagerNative.getDefault()得到ActivityManagerProxy代理对象,进而调用该代理对象的startActivity()方法。
ActivityManagerProxy是ActivityManagerService的代理对象,因此其内部存储的是BinderProxy,调用ActivityManagerProxy.startActivity()实质是调用BinderProxy.transact()向Binder驱动发送START_ACTIVITY_TRANSACTION命令。Binder驱动将处理逻辑从Launcher所在进程切换到ActivityManagerService所在进程。
Server端流程

启动Activity的请求从Client端传递给Server端后,便进入了启动应用的七个阶段,这里也是整理出具体流程

预启动

ActivityManagerService.startActivity()
ActivityStack.startActivityMayWait()
ActivityStack.startActivityLocked()
ActivityStack.startActivityUncheckedLocked()
ActivityStack.startActivityLocked()(重载)
ActivityStack.resumeTopActivityLocked()
暂停

ActivityStack.startPausingLocked()
ApplicationThreadProxy.schedulePauseActivity()
ActivityThread.handlePauseActivity()
ActivityThread.performPauseActivity()
ActivityManagerProxy.activityPaused()
completePausedLocked()
启动应用程序进程

第二次进入ActivityStack.resumeTopActivityLocked()
ActivityStack.startSpecificActivityLocked()
startProcessLocked()
startProcessLocked()(重载)
Process.start()
加载应用程序Activity

ActivityThread.main()
ActivityThread.attach()
ActivityManagerService.attachApplication()
ApplicationThread.bindApplication()
ActivityThread.handleBindApplication()
显示Activity

ActivityStack.realStartActivityLocked()
ApplicationThread.scheduleLaunchActivity()
ActivityThead.handleLaunchActivity()
ActivityThread.performLaunchActivity()
ActivityThread.handleResumeActivity()
ActivityThread.performResumeActivity()
Activity.performResume()
ActivityStack.completeResumeLocked()

停止源Activity

ActivityStack.stopActivityLocked()
ApplicationThreadProxy.scheduleStopActivity()
ActivityThread.handleStopActivity()
ActivityThread.performStopActivityInner()

相关文章
|
5天前
|
搜索推荐 Android开发 iOS开发
探索安卓与iOS系统的用户界面设计哲学
现代移动操作系统的设计哲学不仅仅是技术的表现,更是用户体验与功能实现的结合。本文将深入分析安卓与iOS两大主流系统在用户界面设计方面的差异与共通之处,探讨它们背后的思维模式及其对用户体验的影响。 【7月更文挑战第11天】
|
1月前
|
调度 Android开发
43. 【Android教程】服务:Service
43. 【Android教程】服务:Service
24 2
|
2天前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
32 15
|
1月前
|
Java Linux Android开发
Android面试题之说说系统的启动流程(总结)
这篇文章概述了Android系统的启动流程,从Boot Rom到Zygote进程和SystemServer的启动。init进程作为用户级别的第一个进程,负责创建文件目录、初始化服务并启动Zygote。Zygote通过预加载资源和创建Socket服务,使用fork函数生成SystemServer进程。fork过程中,子进程继承父进程大部分信息但具有独立的进程ID。Zygote预加载资源以减少后续进程的启动时间,而SystemServer启动众多服务并最终开启Launcher应用。文中还讨论了为何从Zygote而非init或SystemServer fork新进程的原因。
33 2
|
11天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
10 0
|
16天前
|
Java Linux Android开发
详细解读android6.0SerialPort服务
详细解读android6.0SerialPort服务
|
1月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
29 2
|
22天前
|
安全 搜索推荐 Android开发
探索安卓和iOS系统的优劣与特点
在移动操作系统领域,安卓和iOS一直是最热门的两个选择。本文将探讨安卓和iOS系统的优劣与特点,帮助读者更好地了解这两个操作系统,并为选择合适的移动设备提供参考。
23 0
|
1月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的安卓的微博客系统的详细设计和实现
基于SpringBoot+Vue+uniapp的安卓的微博客系统的详细设计和实现
16 0
|
1月前
|
前端开发 Java API
Android系统中读写和显示图片
Android系统中读写和显示图片
17 0