AMS服务(安卓)

安卓的 AMS 即 Activity Manager Service,是 Android 系统中的核心服务之一。

主要功能

Activity生命周期管理

启动与创建

当应用启动一个activity时,AMS会检查该activity的启动条件是否满足(权限,intent过滤器等)。如果条件满足,AMS会为该activity分配资源,并调用ActivityThread相关方法来创建和启动该activity。

状态转换

当activity运行中,AMS会根据用户的操作或者系统状态变化(屏幕旋转、应用切换)来管理activity的状态(暂停、恢复、停止、销毁等)。

任务栈管理

任务栈的创建和维护

AMS会为每个应用或者任务分配一个任务栈,用于管理该任务或者应用中的每一个activity。

当启动一个新的activity时,AMS会根据启动模式来讲activity放到相应的任务栈中。

启动模式

在 Android 中,Activity 的启动模式决定了 Activity 在任务栈中的创建和管理方式,主要有以下四种启动模式。

开发者可以在 AndroidManifest.xml 文件中通过为标签设置android:launchMode属性来指定 Activity 的启动模式,也可以在通过 Intent 启动 Activity 时使用FLAG_ACTIVITY_NEW_TASK等标志来动态改变启动模式的行为。

standard(标准模式)

  • 特点:这是 Activity 的默认启动模式。每当启动一个新的 Activity 时,系统都会在当前任务栈中创建一个新的实例,无论这个 Activity 是否已经存在于任务栈中。
  • 应用场景:适用于大多数普通的 Activity,比如一个应用中的详情页面,每次打开都需要一个新的实例来显示不同的数据。

singleTop(栈顶复用模式)

  • 特点:当需要启动的Activity已经处于栈顶,那么就不用创建一个新的Activity,直接复用栈顶的Activity,并通过onNewIntent()将新的Intent传递给它。如果不在栈顶,那就创建一个新的压入栈顶。
  • 应用场景:常用于接收通知后打开的 Activity 等场景。例如,一个新闻应用的推送通知点击后打开新闻详情页,如果用户连续点击多次相同新闻的推送,采用 singleTop 模式可以避免在栈顶创建多个相同新闻详情页的实例。

singleTask(栈内复用模式)

  • 特点:会先检查栈内有没有需要启动的那个Activity,如果有,那么将该Activity上面的Activity全部出栈,使其成为栈顶,并调用onNewIntent()。如果没有,老样子,创新的。
  • 应用场景:适用于具有全局唯一性的 Activity,比如应用的主界面。以浏览器应用为例,无论在哪个页面点击返回主界面,都应该回到同一个主界面实例,而不是创建多个主界面实例。

singleInstance(单实例模式)

  • 特点:这个模式下的启动的Activity会被放到一个单独的任务栈,这个任务栈只有一个Activity就是它自己,当别的组件启动该Activity时是直接调用而不是创建。
  • 应用场景:常用于需要在多个应用之间共享或独立运行的特殊 Activity,比如系统的电话拨号界面。它独立于其他应用的任务栈,确保在任何时候都只有一个实例存在,并且可以方便地被其他应用调用。

任务切换与恢复

当通过系统导航栏或者任务界面切换应用时,AMS会根据任务栈的记录,将目标的任务栈切换到前台(涉及到WMS),并恢复栈顶activity的运行状态(例如,调用栈顶 Activity 的onResume()方法,使其重新获得焦点并可以响应用户操作)。

进程管理

进程启动与调度

当一个应用需要一个新的进程运行组件时,AMS会与Zygote进行通信,创建新的进程,并把相关的组件信息传递给新的进程。同时,AMS会根据资源的情况和应用优先级,对各个进程进行调度,决定哪些进程可以获得CPU时间片等资源。

进程回收与管理

为了保证系统的稳定性和资源有效利用。AMS会根据系统资源的紧张程度对进程进行回收。它会根据进程的优先级,如前台进程、可见进程、服务进程、后台进程等,选择合适的进程进行回收,以释放系统资源。

进程等级

  1. 前台进程

    • 定义:前台进程是与用户正在进行交互的进程,对用户体验至关重要,系统会尽最大努力保持其运行。
    • 举例:当用户正在使用某个应用进行操作,比如正在玩游戏、编辑文档、观看视频等,此时该应用所在的进程就是前台进程。还有当一个应用的 Activity 处于前台并正在与用户交互,或者有前台 Service 正在运行(如正在播放音乐的音乐播放器 Service),以及与前台 Activity 绑定的 Service 等,都属于前台进程。
  2. 可见进程

    • 定义:可见进程是指其组件对用户可见,但不处于前台交互状态的进程。这些进程虽然没有直接与用户进行交互,但仍然在用户的视线范围内,对用户体验有一定影响。
    • 举例:比如一个应用的 Activity 部分被遮挡,但仍然有部分界面可见,或者应用中有一个悬浮窗在屏幕上显示,此时该应用的进程就是可见进程。
  3. 服务进程

    • 定义:服务进程是指正在运行着 Service 的进程,这些 Service 通常在后台执行一些长时间运行的操作,不提供直接的用户界面,但对应用的功能至关重要。
    • 举例:常见的如文件下载服务、数据同步服务等。以手机中的云盘应用为例,当用户在后台进行文件上传或下载时,云盘应用的服务进程就在运行,负责处理文件的传输操作,即使用户切换到其他应用,这个服务也应该继续运行,以保证文件传输的顺利进行。
  4. 后台进程

    • 定义:后台进程是指其组件已经不可见,且没有正在运行的前台 Service 或其他重要组件的进程。这些进程对用户当前的操作没有直接影响,系统在内存不足时会优先回收这类进程。
    • 举例:当用户打开一个应用查看了一些信息后,将其切换到后台,且该应用没有在后台进行重要的任务,如没有进行文件下载、数据同步等操作,那么这个应用所在的进程就是后台进程。
  5. 空进程

    • 定义:空进程是指不包含任何活动组件的进程,系统保留这类进程主要是为了提高下次启动该应用的速度,在系统资源紧张时,空进程会被首先杀死。
    • 举例:当一个应用完全退出后,系统可能会暂时保留其进程一段时间,此时该进程就是空进程,它不执行任何实际的操作,只是占用了一些系统资源,如果系统资源不足,它会是第一个被回收的对象。

Intent的解析与分发

Intent匹配

当应用发送一个新的Intent时,AMS会根据该Intent的动作、数据、类别等信息,在系统中查找符合条件的Activity或其他组件。它会遍历系统中所有应用的AndroidManifest.xml文件,找到符合条件的组件。

Intent分发

找到合适的组件后,AMS会将该Intent分发给相应的组件。

系统资源管理与监控

内存管理

AMS 会监控系统的内存使用情况,当内存不足时,会采取一系列措施来释放内存,如回收后台进程、杀死低优先级的应用等。同时,它也会为每个应用分配一定的内存限额,防止应用过度占用内存。

电量管理

AMS 会与电源管理模块协作,根据设备的电量状态和应用的使用情况,对应用的行为进行优化,如降低后台应用的更新频率、限制某些高耗电操作等,以延长设备的电池续航时间。

工作原理

AMS与应用进程的通信

运行位置与通信基础

AMS作为安卓系统的核心系统服务,运行在系统进程中。它是整个系统管理Activity的关键枢纽。

AMS与应用进程之间的通信是通过Binder机制实现的。

应用进程发送请求

当应用进程需要执行某些操作时,如创建一个新的Activity或者发送一个Intent,会通过Binder向AMS发送请求。

例如,在一个音乐播放应用中,当用户点击播放列表中的一首歌曲时,应用进程会构建一个包含相关信息(如歌曲 ID、播放模式等)的 Intent,并通过 Binder 机制将这个启动播放界面 Activity 的请求发送给 AMS。这个过程就像是应用进程在向 AMS “喊话”,告诉它自己想要做什么。

AMS 处理请求与返回结果

当AMS收到应用的请求后,会对 Activity 的启动模式、任务栈管理、权限检查等多方面的考量。

例如,如果请求启动的 Activity 是一个新的任务栈的根 Activity,AMS 会创建一个新的任务栈,并将该 Activity 压入栈中。在完成相应的处理后,AMS 会通过 Binder 回调将结果返回给应用进程。比如,告知应用进程 Activity 是否成功启动,或者返回一些与 Intent 处理相关的结果数据等。这样,应用进程就能够根据 AMS 返回的结果来决定后续的操作,如更新界面显示等。

AMS 与其他系统服务的交互

与 Window Manager Service(WMS)的交互

AMS 与 WMS 密切协作,共同管理应用的界面显示和窗口管理。当 AMS 启动一个 Activity 时,它会与 WMS 进行交互,告知 WMS 需要创建一个新的窗口来显示该 Activity。WMS 负责管理窗口的布局、尺寸、层级等属性,确保各个窗口能够正确地显示在屏幕上,并且不会相互重叠或出现显示异常。例如,当用户从一个 Activity 切换到另一个 Activity 时,AMS 会通知 WMS 进行相应的窗口切换操作,WMS 会根据 AMS 提供的信息,将新 Activity 的窗口显示在前台,并对窗口进行动画过渡等效果处理,为用户提供流畅的界面切换体验。

与 Package Manager Service(PMS)的交互

AMS 与 PMS 之间也有着重要的交互。PMS 主要负责管理应用的安装、卸载、版本信息等。AMS 在启动应用组件或处理 Intent 等操作时,需要从 PMS 获取相关的应用信息,如应用的包名、组件信息、权限列表等。例如,当 AMS 接收到一个启动某个 Activity 的 Intent 时,它会向 PMS 查询该 Activity 所属应用的相关信息,以确保该应用具有正确的权限和配置,能够正常启动。同时,当应用安装或卸载完成后,PMS 会通知 AMS,以便 AMS 更新其内部的应用组件信息和任务栈等数据,保证系统对应用的管理始终处于最新和正确的状态。

 

 

你可能感兴趣的:(android)