AMS(Activity Manager Service)
- 核心功能总结
- Activity 与任务管理:AMS 掌管着 Activity 的生命周期,从 Activity 的启动、暂停、恢复到销毁,都由它来控制。同时,它还管理着任务栈,确保应用内的 Activity 能按照合理的顺序和规则进行切换和管理。
- 进程管理:负责应用进程的启动、调度和回收。根据系统资源状况和应用的优先级,决定哪些进程可以获得 CPU 时间片,哪些进程需要被回收以释放资源。
- 与其他服务协作:在启动 Activity 时,AMS 会和 WMS、PMS 紧密合作。一方面向 WMS 提供创建窗口所需的参数,另一方面从 PMS 获取应用的权限信息、组件信息等,以确保 Activity 能够正常启动和运行。
- 举例:当你点击手机桌面的微信图标启动微信时,AMS 会检查微信是否已经有进程在运行,如果没有,就会启动一个新的进程,然后根据微信启动 Activity 的请求,管理该 Activity 的创建和启动流程,同时与 WMS 沟通创建窗口,从 PMS 处获取微信的权限配置等信息。
WMS(Window Manager Service)
- 核心功能总结
- 窗口管理:WMS 主要负责窗口的创建、布局、显示和销毁。它根据 AMS 提供的信息,为 Activity、Dialog 等组件创建对应的窗口,并确定窗口在屏幕上的位置、大小和层级关系。
- 输入事件处理:接收来自底层输入设备(如触摸屏、键盘)的输入事件,并将这些事件准确地分发给对应的窗口和应用组件。
- 动画与过渡效果:实现窗口切换、显示和隐藏时的动画效果,提升用户体验。
- 举例:当微信的主界面 Activity 启动时,AMS 通知 WMS 创建一个窗口来显示这个 Activity。WMS 会根据屏幕分辨率、Activity 的布局要求等,确定窗口的大小和位置,然后将窗口显示在屏幕上。当你从微信主界面切换到聊天界面时,WMS 会执行相应的窗口切换动画,让界面过渡更加流畅。
PMS(Package Manager Service)
- 核心功能总结
- 应用包管理:负责应用的安装、卸载、更新等操作。解析应用的 APK 文件,将应用的代码、资源等文件安装到系统中,并在系统数据库中记录应用的相关信息。
- 权限管理:在应用安装时,根据应用在清单文件中声明的权限列表,为应用分配相应的权限。在应用运行过程中,检查应用是否具有执行特定操作的权限。
- 应用信息管理:存储和管理所有已安装应用的元数据,包括应用的名称、图标、版本号、组件信息等,为其他系统服务和应用提供查询接口。
- 举例:当你从应用商店下载并安装微信时,PMS 会解析微信的 APK 文件,将其安装到系统指定的目录,并在系统数据库中记录微信的包名、版本号、所需权限等信息。当微信启动某个需要相机权限的功能时,AMS 会向 PMS 查询微信是否已经被授予了相机权限,PMS 根据记录进行权限检查并返回结果。
PMS与WMS
应用安装与窗口资源加载
- 安装时资源解析:当你从应用商店下载并安装微信时,PMS 会对微信的 APK 文件进行解析。APK 文件里包含了微信界面所需的各种资源,比如聊天界面的布局文件、微信图标、聊天气泡样式等。PMS 会仔细解析这些资源信息并存储到系统数据库中。当你首次启动微信,WMS 要创建微信主界面窗口时,就会依据 PMS 解析好的资源信息来加载相应的布局和图片。例如,WMS 会从 PMS 记录的资源路径中找到微信的 logo 图片,并将其显示在微信启动界面上。
- 运行中资源获取:在使用微信过程中,WMS 会持续从 PMS 提供的资源库中获取所需资源。比如当你打开微信的某个聊天窗口,WMS 需要加载聊天消息的布局和头像等资源。它会根据 PMS 存储的资源索引,准确找到对应的头像图片和消息气泡的布局文件,然后将这些元素组合并显示在聊天窗口中。
应用权限与窗口交互
- 权限限制窗口功能:微信有一些窗口相关的功能需要特定权限才能使用,例如微信的悬浮窗功能,可让你在使用其他应用时也能查看微信消息。PMS 负责管理微信的权限设置。当你开启微信悬浮窗功能时,WMS 会向 PMS 查询微信是否拥有悬浮窗权限。如果 PMS 显示微信没有该权限,WMS 就不会创建悬浮窗,这样就能防止未经授权的窗口显示,保障系统安全和用户体验。
- 权限变更影响窗口显示:假设你最初授予了微信摄像头权限,在视频通话时 WMS 可以正常加载摄像头画面到微信视频通话窗口中。但如果后来你在系统设置里撤销了微信的摄像头权限,PMS 会更新微信的权限状态。WMS 在检测到这个权限变更后,会立即停止加载摄像头画面,可能会在视频通话窗口显示一个提示信息,告知你权限已被撤销。
系统状态与窗口管理
- 应用卸载时窗口关闭:当你决定卸载微信时,PMS 会执行卸载操作。在这个过程中,PMS 会通知 WMS 关闭微信的所有窗口。比如,如果你当时正在微信的聊天窗口或者朋友圈界面,WMS 接收到 PMS 的通知后,会迅速关闭这些窗口,释放相关的系统资源,避免出现窗口残留影响系统界面的整洁和正常使用。
- 系统更新后窗口调整:当微信进行版本更新时,PMS 会处理更新操作并更新微信的版本信息和配置。如果更新内容涉及到微信界面布局或显示方式的改变,PMS 会将这些新的信息传达给 WMS。例如,新版本微信对聊天列表的布局进行了优化,WMS 会根据 PMS 提供的新布局信息,对微信聊天列表窗口进行重新布局和显示调整,以保证你看到的是更新后的界面效果。
PMS与AMS
PMS 对静态广播 action 的保存
当应用安装时,PMS(Package Manager Service)会解析应用的 AndroidManifest.xml 文件。对于其中静态注册的广播接收器(<receiver>
标签),PMS 会提取广播接收器所监听的 action
等信息,并将这些信息存储在系统数据库中。
以微信为例,假设微信在 AndroidManifest.xml 中静态注册了一个广播接收器用于接收系统电量变化的广播,代码可能如下:
<receiver android:name=".PowerChangeReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
</intent-filter>
</receiver>
PMS 在安装微信时,会解析这段配置,识别出 PowerChangeReceiver
广播接收器监听的 action
为 android.intent.action.BATTERY_CHANGED
,并把这个 action
以及对应的广播接收器类名等信息保存到系统数据库里。
AMS 处理广播时与 PMS 的交互
当系统中有符合特定 action
的广播发出时,AMS(Activity Manager Service)会负责处理广播的分发。AMS 会去查询 PMS 保存的信息,以找到所有监听该 action
的广播接收器。
继续以电量变化广播为例,当系统电量发生变化,发出 android.intent.action.BATTERY_CHANGED
广播时,AMS 会向 PMS 询问哪些应用的广播接收器监听了这个 action
。PMS 会根据之前保存的信息,将所有监听该 action
的广播接收器的相关信息(如类名、所在应用包名等)返回给 AMS。
AMS 触发广播接收器执行
AMS 拿到这些信息后,会根据这些信息创建相应广播接收器的实例,并调用其 onReceive()
方法来处理广播。在微信的例子中,AMS 会创建 PowerChangeReceiver
类的实例,并调用它的 onReceive()
方法,让微信能够对电量变化事件做出响应,比如更新界面上的电量显示等。
综上所述,PMS 会保存静态广播的 action
信息,而 AMS 在处理广播分发时会依赖 PMS 保存的这些信息来找到合适的广播接收器进行广播的分发和处理。