Android中的AMS(Activity Manager Service)详解

news2024/11/18 6:43:49

Android中的AMS(Activity Manager Service)详解

AMS (Activity Manager Service) 是 Android 系统中非常核心的服务之一,它负责管理应用程序的生命周期、任务栈、进程、广播、服务等功能。AMS 是整个 Android Framework 的调度中心,它的运作直接影响应用的性能和用户体验。

在这里插入图片描述

AMS 运行在 SystemServer 中,是一种 Binder IPC 服务,客户端通过 Binder 与 AMS 交互,完成相关任务。

AMS 的主要职责

  1. 应用程序生命周期管理
  • 启动和停止 Activity、Service
  • 管理任务栈(Task Stack)
  • 管理进程优先级和内存
  1. 任务和进程管理
  • 启动和调度应用进程
  • 杀死后台进程以释放内存
  • 分配进程资源
  1. 广播机制管理
  • 负责广播的注册与分发(包括普通广播和有序广播)
  1. 服务管理
  • 启动和绑定 Service,管理其生命周期
  1. 任务栈和Activity栈管理
  • 管理 Activity 的启动、销毁及任务栈状态

AMS 的启动过程

1. SystemServer 初始化

AMS 是在 SystemServer 启动时初始化的。

相关代码路径:frameworks/base/services/core/java/com/android/server/SystemServer.java

private void startBootstrapServices() {
    // 省略其他服务的启动
    ActivityManagerService mActivityManagerService = 
        ActivityManagerService.Lifecycle.startService(context);
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
}
  1. ActivityManagerService.Lifecycle.startService:
    AMS 的 Lifecycle 类负责创建并启动服务。
  2. AMS 的构造方法会初始化一些关键模块(如进程管理、广播队列等)。
2. AMS 的主线程 Looper 初始化

在 AMS 的初始化过程中,会为主线程创建一个消息循环。

public ActivityManagerService(Context systemContext) {
    mHandlerThread = new ServiceThread(TAG, ...);
    mHandlerThread.start();
    mHandler = new ActivityManagerHandler(mHandlerThread.getLooper());
}
  • ServiceThread: AMS 的主线程,专门处理消息和任务。
  • ActivityManagerHandler: 负责处理各种消息和调度任务。

AMS 的核心功能

1. 管理 Activity 的生命周期

AMS 是 Activity 生命周期的调度中心,负责 Activity 的启动、停止以及状态切换。以下是核心流程:

  1. Activity 启动流程
  • 客户端通过 startActivity 请求 AMS。
  • AMS 通过 IApplicationThread 通知目标进程。
  • 目标进程通过 Instrumentation 调用 ActivityThread 完成 Activity 的创建。核心代码(AMS 的 startActivity 方法):
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, ...) {
    synchronized (this) {
        // 组装Activity的启动请求
        ActivityRecord r = new ActivityRecord(...);
        // 将请求加入任务队列
        mStackSupervisor.startActivityLocked(r, ...);
    }
}
  1. Activity 的状态管理AMS 使用 ActivityStackSupervisorActivityRecord 来管理和跟踪 Activity 的状态。
2. 进程管理

AMS 使用 ProcessListProcessRecord 来管理进程的优先级和资源分配。

  • 启动进程:
    AMS 调用 zygote 进程 fork 子进程,然后通过 ApplicationThread 连接新进程。
Process.start("com.example.app", appInfo.uid, appInfo.processName);
  • 杀死进程:
    AMS 根据内存和优先级策略,通过 Process.killProcess 杀死后台进程。
3. 广播管理

AMS 的 BroadcastQueue 负责广播的调度和分发。

public void broadcastIntent(Intent intent, ...) {
    // 将广播请求加入队列
    BroadcastRecord r = new BroadcastRecord(intent, ...);
    mBroadcastQueue.enqueueBroadcast(r);
}
  • 普通广播: 同时分发给多个接收器。
  • 有序广播: 按优先级分发,接收器可终止广播。

AMS 的关键数据结构

  1. ActivityRecord
  • 表示一个具体的 Activity 实例,保存其状态、任务栈信息等。
  1. TaskRecord
  • 表示一个任务栈,包含多个 ActivityRecord。
  1. ProcessRecord
  • 表示一个进程,包含其运行时状态、绑定的服务等信息。
  1. BroadcastRecord
  • 表示一次广播请求,包括目标接收器列表和状态信息。

AMS 与 Binder 通信

AMS 是一个 Binder 服务,应用进程通过 AIDL 接口与 AMS 交互。

  • AIDL 接口路径:IActivityManager.aidl
interface IActivityManager {
    int startActivity(...);
    void finishActivity(...);
}
  • AMS 的 Binder 处理:
public class ActivityManagerService extends IActivityManager.Stub {
    public int startActivity(...) {
        enforceCallingPermission(...);
        return startActivityInternal(...);
    }
}

总结

AMS 是 Android 的核心服务,承担了大量系统任务。其设计基于模块化的架构,通过 Binder 实现客户端和服务端的解耦。深入理解 AMS 源码有助于优化应用性能和排查系统问题。

如果需要具体模块的更深层次分析,可以指定细化部分继续讨论!

参考

ActivityManagerService Part 1: Structure and Basic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

31.3 XOR压缩和相关的prometheus源码解读

本节重点介绍 : xor 压缩value原理xor压缩过程讲解xor压缩prometheus源码解读xor 压缩效果 xor 压缩value原理 原理:时序数据库相邻点变化不大,采用异或压缩float64的前缀和后缀0个数 xor压缩过程讲解 第一个值使用原始点存储计算和前面的值的xor 如果XOR值为0&…

UNIAPP发布小程序调用讯飞在线语音合成+实时播报

语音合成能够将文字转化为自然流畅的人声,提供100发音人供您选择,支持多语种、多方言和中英混合,可灵活配置音频参数。广泛应用于新闻阅读、出行导航、智能硬件和通知播报等场景。 在当下大模型火爆的今日,语音交互页离不开语音合…

【蓝牙协议栈】【BLE】【BAS】精讲蓝牙电池服务

1. 蓝牙电池服务(Bluetooth Battery Service)概念 蓝牙电池服务是蓝牙设备与其他设备通信时用于报告其剩余电池电量的标准服务。它让用户能够随时了解蓝牙设备(如无线耳机、智能手表、蓝牙鼠标/键盘等)的电池状态,从而方便地管理这些设备的续航与电源使用。 BAS通常用于在…

无线迷踪:陈欣的网络之旅

第一章 陈欣是一名资深的网络工程师,工作在一家领先的科技公司。她的生活平静而有序,直到有一天,公司的无线网络突然出现了严重的问题。员工们的设备频繁断开连接,无法正常使用。这个问题不仅影响了工作效率,还引起了…

【redis】—— 环境搭建教程

上一节,我们大致了解了Redis的几个重要版本,在本教程中,我们选择了5.0版本,因为5.0已经具备了大部分的功能特性,并且与7.0版本相比,其安装使用过程更为简便。 Redis的官方并不直接支持微软的Windows操作系统…

如何查看python源代码

众所周知,Python内建了许多函数模块,并且我们可能还会安装许多第三方模块等等。 下面以getpass为例查看其源代码。 1.help(getpass) 输入该命令找到file路径,并且可以查看其其提供的功能。 2.利用getpass.__file__查看位置 最后找到该文件…

java笔试练习题笔记(10)

关于继承和实现说法正确的 是 ? ( )A.类可以实现多个接口,接口可以继承(或扩展)多个接口 B.类可以实现多个接口,接口不能继承(或扩展)多个接口 C.类和接口都可以实现多个接口 D.类和接口都不…

前端开发之打印功的使用和实例(vue-print-nb)

通过插件来进行实现 前言效果图1、安装插件vue2vue32、 引入Vue项目2、 使用2.1、在项目中创建按钮并且使用v-print绑定绑定打印事件2.2、编写要打印的内容,给内容附加唯一的id2.3、绑定的时间的方法和参数3、整体代码(此代码是通过vue3来进行实现的但是逻辑都是一样的)前言…

NavVis VLX3的精度怎么去进行验证?【上海沪敖3D】

01、精度评价现状 三维捕捉行业还没有建立一个用于估算或验证移动激光扫描系统精度的统一标准。因此,需要高精度交付成果的专业人士很难相信设备所标注的精度规格,也就很难知道基于SLAM的移动激光扫描系统是否适合当前的项目。 NavVis将通过展示一种严格…

Java | Leetcode Java题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; class Solution {public String nearestPalindromic(String n) {long selfNumber Long.parseLong(n), ans -1;List<Long> candidates getCandidates(n);for (long candidate : candidates) {if (candidate ! selfNumber) {if (ans…

ES6标准-Promise对象

目录 Promise对象的含义 Promise对象的特点 Promise对象的缺点 Promise对象的基本用法 Promise对象的简单例子 Promise新建后就会立即执行 Promise对象回调函数的参数 Promise参数不会中断运行 Promise对象的then方法 Promise对象的catch()方法 Promise状态为resolv…

如何利用CSS制作导航菜单

1.利用CSS技术&#xff0c;结合链接和列表&#xff0c;设计并实现“山水之间”页面 示例代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>山水之间</title><style>.all{width:900px;}.top{width:900px;h…

Github 2024-11-17 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10JavaScript项目2Nextcloud服务器:安全的数据之家 创建周期:2796 天开发语言:PHP, JavaScript协议类型:GNU Affero General Public…

【工具变量】2024-2025年地级市异质性数据、城市分组异质性数据(老工业、环境保护、人口流入、沿海等)

一、数据范围&#xff1a; &#xff08;1&#xff09;南北方城市 &#xff08;2&#xff09;东中西城市 &#xff08;3&#xff09;七大地理区、八大综合经济区 &#xff08;4&#xff09;城市群&#xff0c;长三角珠三角京津冀等 &#xff08;5&#xff09;长江流域沿岸、黄河…

响应式网页设计--css

CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是用来控制网页的外观和布局的语言。它与 HTML 一起工作&#xff0c;通过样式定义网页元素的显示方式。CSS 可以控制多种视觉效果&#xff0c;如字体、颜色、布局、间距等。 基本语法&#xff1a; C…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

基于Hadoop、hive的数仓搭建实践

文章目录 架构图Hadoop搭建Hive 搭建MySQL搭建官网文档下载配置配置hive环境变量配置日志文件配置hive-site 复制mysql 驱动包删除日志包初始化元数据启动metastore服务使用hive CLI启动hiveServer2访问hiveserver2客户端连接beeline shell连接 Dbeaver连接经验 基于HDFS Hive…

跨平台WPF框架Avalonia教程 一

安装 安装 Avalonia UI 模板​ 开始使用 Avalonia 的最佳方式是使用模板创建一个应用程序。 要安装 Avalonia 模板&#xff0c;请运行以下命令&#xff1a; dotnet new install Avalonia.Templates 备注 对于 .NET 6.0 及更早版本&#xff0c;请将 install 替换为 --inst…

“fc-async”提供了基本的异步处理能力

在开发中,异步处理已经成为提升系统性能和用户体验的常用方式。然而,传统的@Async注解和基础的异步处理工具在面对复杂的任务场景时,存在局限性。这些局限性包括但不限于高并发环境下的稳定性、任务失败后的恢复机制、以及任务的监控和管理。 开源项目“fc-async”提供了基…

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…