当前位置: 首页 > 工具软件 > AMS > 使用案例 >

Android系统重要组件AMS

窦凯定
2023-12-01

AMS(Activity Manager Service)是Android系统中负责管理和调度Activity生命周期和任务栈的服务。AMS通过使用一些系统资源和数据结构(如进程、任务栈、记录Activity生命周期的状态机等)来管理Activity生命周期。当用户在设备上执行新的操作时,AMS会找到相应的任务栈,并根据其优先级来判断应该启动哪个Activity。除此之外,AMS也负责检查和处理系统内存的使用情况,并根据需要重新排列和重组任务栈中的Activity。

一、Android AMS原理

AMS(Activity Manager Service)是Android系统的一部分。它的主要功能是管理应用程序的生命周期和应用程序之间的交互。AMS的实现原理如下:

  1. 应用程序启动过程

当用户点击应用程序的图标时,首先由Launcher应用程序向AMS发送一个启动请求。AMS根据包名和类名来找到对应的Activity并启动Activity。AMS在启动Activity的过程中,会创建Activity所在的进程,并将Activity的生命周期控制在AMS中。

  1. Activity的生命周期管理

AMS负责管理应用程序的Activity的创建、运行、销毁等生命周期。AMS通过与Zygote进行通信创建Activity实例,然后根据Activity的状态(Resume、Pause、Stop等)来管理Activity的运行状态,当应用程序处于后台运行时,AMS会将其进程变为缓存进程,当内存不足时,AMS会杀死缓存进程。同时AMS还负责监测应用程序的内存使用情况,当系统内存不足时,AMS会根据优先级来终止一些应用程序的Activity实例以释放内存。

  1. 应用程序之间的交互

AMS负责监控应用程序的交互情况。当用户启动一个新的应用程序时,AMS会检查该应用程序是否已经在运行中,并根据需要执行相应的操作:如果应用程序已经在运行中,则直接切换到该应用程序;如果应用程序不存在,则启动该应用程序;如果应用程序在后台运行,则将该应用程序切换到前台。

  1. 系统服务的调度

AMS还负责管理系统服务的调度。系统服务包括Wi-Fi、蓝牙等,AMS会启动、停止或重启这些系统服务,以保证系统的正常运行。

  1. 应用程序的任务管理

AMS还负责管理应用程序的任务,它可以将多个应用程序的Activity组成一个任务,提供任务导航和管理等功能。

  1. 应用程序的权限管理

AMS还负责管理应用程序的权限,当应用程序请求权限时,AMS会弹出对话框询问用户是否授权,如果用户授权,则AMS将应用的权限信息存储到系统中。

总之,AMS是Android系统中非常重要的一个服务,它管理应用程序的运行状态和系统资源的使用,保证系统的正常运行和用户的良好使用体验。

二、Android AMS代码分析

AMS的核心代码在frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java中。AMS主要包括三个核心模块:进程管理、Activity管理和任务管理。

AMS主要由以下几个类组成:

1.ActivityStack是用于管理应用程序任务栈的类。每个活动均可作为任务栈的顶部元素,所有任务栈中的活动都由ActivityStack类管理。

2.ActivityRecord是用于记录和管理活动生命周期的类。它跟踪了每个活动的状态以及它在哪个任务栈中,从而使AMS能够准确地管理和调度活动。

3.ActivityManagerService是AMS的主要服务代码。它包含了很多方法来管理应用程序、任务栈和活动。例如,startActivity方法用于启动一个新的Activity,moveTaskToFront方法用于将指定任务的栈移到前台等。

下面简单介绍一下Android AMS的实现代码:

  1. ActivityManagerService类:AMS的核心类,负责管理应用程序的生命周期、进程的创建和销毁。AMS的主要方法包括:
  • startProcessLocked():启动一个新进程。
  • killProcessesLocked():杀死不必要的进程。
  • attachApplicationLocked():将应用程序绑定到AMS。
  • handleAppDiedLocked():处理应用程序死亡事件。
  1. ActivityStack类:管理应用程序的Activity栈,即Activity任务。一个ActivityStack对应一个Activity任务。ActivityStack的主要方法包括:
  • startActivityLocked():启动一个新的Activity。
  • moveToBackLocked():将当前Activity移动到栈底。
  1. ActivityRecord类:表示一个Activity实例,不同的Activity实例对应不同的生命周期阶段。ActivityRecord的主要方法包括:
  • setState():改变Activity的当前状态。
  • makeActive():将Activity实例激活。
  1. ProcessRecord类:表示一个进程实例,负责管理进程的生命周期。进程之间的通信采用Binder机制。ProcessRecord的主要方法包括:
  • startProcess():启动一个新的进程。
  • kill():结束进程。
  1. ActivityTaskManagerService类:主要负责处理应用程序的Task相关问题。Task是一组相关的Activity的集合,它们可以共享一个Back键返回栈,通常处于同一个任务栏中。ActivityTaskManagerService的主要方法包括:
  • startActivity():启动一个新的Activity并添加到Task中。
  • moveTaskToFront():将指定的Task移动到前台。

总之,Android AMS的实现代码非常复杂,包含了很多不同的类和方法。理解AMS的工作原理对开发者来说非常重要,可以帮助我们更好地开发Android应用程序。

三、Android AMS常见方法

常用方法:

1.startActivity(Intent intent):启动指定的Activity

//启动Activity
public final int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
                            String resolvedType, IBinder resultTo, String resultWho, int requestCode,
                            int startFlags, ProfilerInfo profilerInfo, Bundle options) {
   // ...省略其他代码...
   try {
       int res = 0;
       // 根据intent找到要启动的Activity
       ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId);
       // ...省略其他代码...
       // 启动Activity
       res = startActivityLocked(caller, intent, resolvedType, aInfo, resultTo,
               resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid,
               realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified,
               outActivity);
       // ...省略其他代码...
       return res;
   } catch (Exception e) {
       Slog.w(TAG, "Exception when starting activity " + intent, e);
   }
}

2.moveTaskToFront(int taskId, int flags):将指定任务的栈移到前台

3.getRecentTasks(int maxNum, int flags):获取最近任务列表

4.finishActivity(int requestCode):结束指定的Activity

5.getRunningTasks(int maxNum):获取正在运行任务列表

//获取任务栈信息
public List<RunningTaskInfo> getRunningTasks(int maxNum) throws SecurityException {
   return getTasksInternal(maxNum, true /* filterByCaller */, UserHandle.myUserId() /* callingUid */,
           false /* includeIntent */);
}

这些方法是AMS中最常用的方法之一。它们可用于在应用程序之间切换,管理任务栈和活动,以及获取有关系统中活动和任务的信息。

 类似资料: