当前位置: 首页 > article >正文

【Android基础回顾】五:AMS(Activity Manager Service)

Android 的 AMS(Activity Manager Service)是 Android 系统中的核心服务之一,负责管理整个应用生命周期、任务栈、进程和四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的运行。它运行在系统进程 system_server 中,是 Android Framework 层的关键服务。

1 AMS 的基本职责

AMS 是 Framework 层的一个系统服务,作用相当于整个应用生命周期的大管家,主要负责

主要功能说明
Activity 生命周期管理启动、暂停、停止、销毁 Activity
进程管理创建、绑定、终止应用进程
Service 管理启动、绑定、停止服务
Broadcast 管理注册、发送、分发广播
任务栈管理管理多个任务栈(Task)和返回栈(Back Stack)
ANR 检测监控是否发生 ANR(Application Not Responding)
权限检查检查组件是否具有相应权限

2 AMS 所在的位置和通信机制

AMS 是 Java 层的一个单例类,android.app.ActivityManagerService。它运行在 system_server 进程中,系统启动时由 SystemServer.java 初始化。

AMS 使用 Binder IPC 机制 与应用程序通信。应用程序通过 ActivityManager、ActivityTaskManager 等接口与 AMS 通信,AMS 接收到请求后执行相应操作。

AMS 是通过 ServiceManager 向系统注册的,其他模块可以通过 ServiceManager.getService(“activity”) 获取其 Binder 接口。

3 AMS 启动流程

3.1 系统启动阶段

  • init → zygote 启动
  • zygote 通过反射启动 system_server
  • SystemServer.main() → startBootstrapServices() → ActivityManagerService.main()

3.2 AMS 初始化

  • 实例化 ActivityManagerService
  • 调用 setSystemProcess() 将 AMS 注册到 ServiceManager
  • 调用 mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class) 启动

4 Activity 启动流程与 AMS 的作用

假设你调用 startActivity(),AMS 的工作过程如下:

应用进程调用 startActivity()
→ 通过 Instrumentation → ActivityTaskManager → 跨进程调用 AMS。

AMS 收到请求
→ 调用 ActivityStackSupervisor 查找/创建对应的 Task。
→ 如果目标 Activity 不在当前进程,AMS 启动新的应用进程(使用 Zygote 机制)。

进程启动完成后
→ AMS 通知应用进程执行 ActivityThread.performLaunchActivity(),从而真正执行 Activity 的生命周期方法(如 onCreate())。

5 AMS 相关重要类和模块

简要说明
ActivityManagerService核心管理类,负责调度 Activity、Service、广播等
ActivityTaskManagerServiceAndroid 10 后分离出的任务栈管理服务,与 AMS 协作
ActivityStackSupervisor管理任务栈与 Activity 栈(栈结构管理)
ActivityStarter负责启动 Activity 的执行策略
ProcessRecord表示一个应用进程的运行状态
ApplicationThread应用进程端的 Binder 接口,AMS 通过它和应用交互
ActivityThread应用进程中的主线程类,负责真正执行生命周期方法

6 AMS 管理 Service 的流程

启动 Service 的流程:

  • Context.startService() → Binder 调用 AMS 的 startService()
  • AMS 查找目标 Service 所在进程是否存在,不存在则先启动进程
  • 创建或复用 Service 实例,调用其 onCreate() 和 onStartCommand()
  • 绑定 Service 的流程:
  • Context.bindService() → AMS 的 bindService()
  • AMS 管理连接信息,维护客户端和服务端的绑定关系
  • 应用进程收到回调,执行
  • onServiceConnected() 方法

7 AMS 与进程管理

AMS 维护所有应用的进程信息,并负责:

  • 启动进程:通过 Zygote fork
  • 回收进程:当内存不足时,杀掉优先级低的进程(如空进程)
  • 监控进程状态:如是否运行、是否发生 ANR、是否处于前台等

AMS 使用 ProcessList 维护所有进程的信息,每个进程对应一个 ProcessRecord。

8 AMS 与 ANR

AMS 会检测应用的响应时间:

  • 主线程在 5 秒内没有响应 Input 或 Binder 请求
  • Service 执行时间超过 20 秒
  • BroadcastReceiver 超过 10 秒(前台)或 60 秒(后台)

AMS 会记录调用栈信息,并将错误写入 traces.txt,所以平时开发中如果碰到ANR,我们首先要想到的就是取分析traces.txt日志。里面会打印ANR发生时候的多个线程的调用堆栈。

AMS的总体运行逻辑

在这里插入图片描述

Q&A

ContentProvider常用于什么场景?

场景说明
不同应用间的数据共享App A 想访问 App B 的数据,App B 提供 ContentProvider 暴露接口
统一封装本地数据访问接口统一访问数据库(SQLite)、文件、网络等数据源,对外提供统一接口
系统数据访问系统提供的内容如联系人、短信、图片等,都通过 ContentProvider 对外提供
数据观察机制可通过 ContentObserver 监听数据变化,实现实时更新 UI
配合 CursorAdapter、Loader 等使用特别适合用于大量数据分页加载和懒加载场景

AMS运行在系统进程 system_server 中,是 Android Framework 层的关键服务。这句话是不是有问题,AMS不是单独一个进程吗?

AMS(ActivityManagerService)是 Android Framework 层的一个核心服务类,它本身运行在系统进程 system_server 中,不是单独的一个进程。

具体来说,system_server 是一个进程,Android 启动时,Zygote 进程通过 fork() 创建了 system_server 进程。system_server 进程负责承载 Android Framework 层的各种系统服务。

而AMS 是 system_server 中的一个 Java 类(单例),ActivityManagerService 是一个 Java 类,不是进程。它在 system_server 进程中被实例化,并通过 ServiceManager 注册为名为 “activity” 的服务。

其他组件(包括 App 进程)通过 Binder 调用这个服务。

AMS运行在 system_server 进程中,这个进程还包含很多其他系统服务。
下面是列出的一些例子:

系统服务所属进程说明
ActivityManagerService(AMS)system_server管理 Activity 和应用进程
WindowManagerService(WMS)system_server管理窗口和界面显示
PackageManagerService(PMS)system_server管理应用包信息(安装、卸载等)
SurfaceFlingersurfaceflinger图形渲染服务,独立于 system_server 运行

持续更新中。。。

相关文章:

【Android基础回顾】五:AMS(Activity Manager Service)

Android 的 AMS(Activity Manager Service)是 Android 系统中的核心服务之一,负责管理整个应用生命周期、任务栈、进程和四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的运行。它运行在系统进程 s…...

pycharm中提示C++ compiler not found -- please install a compiler

1.最近用pycharm编译一个开源库,编译的依赖c compiler 2.单单使用pycharm编译,编译器报错C compiler not found – please install a compiler 3.需要在配置环境中引入对应库 4.从新编译后没有提示:C compiler not found – please install a compiler错误。...

类型别名与类型自动推导

类型别名与类型的自动推导 类型别名 为什么要引入类型别名? 为了给类型赋予特殊含义或便于使用 典型用途 (1)增强代码可移植性 例如:size_t (在不同系统中可能是unsigned int 或 unsigned long) 首先是…...

一站式直播工具:助力内容创作者高效开启直播新时代

近年来,随着互联网技术的不断进步和短视频、直播行业的爆发式增长,越来越多的企业和个人投入到直播电商、互动娱乐、在线教育等场景。直播运营过程中,涉及到数据统计、弹幕互动、流程自动化、内容同步等诸多环节。如何提升运营效率、减少人工…...

【学习笔记】Lamba表达式[匿名函数]

【学习笔记】Lamba表达式[匿名函数] Lamba表达式格式函数模板Lamba表达式例子 Lamba表达式格式 格式: [捕获列表](参数列表) -> 返回类型 { 函数体 }1、捕获列表:指定如何访问外部变量(如 [&x] 引用捕获,[x] 值捕获&#…...

学习笔记(26):线性代数-张量的降维求和,简单示例

学习笔记(26):线性代数-张量的降维求和,简单示例 1.先理解 “轴(Axis)” 的含义 张量的 “轴” 可以理解为 维度的方向索引 。对于形状为 (2, 3, 4) 的张量,3 个轴的含义是: 轴 0(axis0&…...

以智能管理为基础,楼宇自控打造建筑碳中和新路径

在全球气候变化的严峻形势下,“碳中和”已成为各国发展的重要战略目标。建筑行业作为能源消耗与碳排放的“大户”,其运行阶段的能耗占全社会总能耗近40%,碳排放占比与之相当,实现建筑碳中和迫在眉睫。传统建筑管理模式下&#xff…...

81 实战一:给root目录扩容

添加一块100G硬盘 vgextend centos /dev/sdb1 /dev/sdc lvextend -L +120G /dev/centos/root xfs_growfs /dev/centos/root df -h 看是否扩容成功 82 实战二:给swap空间扩容 添加一块20G硬盘 fdisk -l 可以看到新添加的硬盘 vgextend centos /dev/sdd …...

1130 - Host ‘xxx.x.xx.xxx‘is not allowed to connect to this MySQL server

以下为本次问题的解决办法: 1、暂停mysql容器: docker stop mysql 2、删除mysql容器:docker rm mysql 3、查看mysql容器是否被删除:docker ps -a #没有mysql容器就是删除成功 4、run mysql容器: docker run -d --…...

HttpURLConnection实现

我有一个接口 http://ip:port/Others/airportnew/,采用post方法调用,采用body方式传值,其body内容为{"data": {"data": {"image": ""}} },现在我需要在java中调用这个接口,帮…...

day029-Shell自动化编程-计算与while循环

文章目录 1. read 交互式初始化变量1.1 案例-安装不同的软件1.2 案例-比较大小 2. 计算2.1 bc2.2 awk2.3 expr2.4 let2.5 案例-计算内存的空闲率2.6 案例-检查域名过期时间和https整数过期时间 3. 循环3.1 循环控制语句3.2 for循环-c语言格式3.3 while循环3.3.1 案例-猜数字3.3…...

Linux命令基础(2)

su和exit命令 可以通过su命令切换到root账户 语法:su [-] 用户名 -符号是可选的,表示是否在切换用户后加载环境变量,建议带上 参数:用户名,表示要切换的用户,用户名可以省略,省略表示切换到ro…...

vue3 + vite实现动态路由,并进行vuex持久化设计

在后台管理系统中,如何根据后端返回的接口,来动态的设计路由呢,今天一片文章带你们解 1、在vuex中设置一个方法 拿到完整的路由数据 const state {routerList: []}; const mutations { dynameicMenu(state, payload) {// 第一步 通过glob…...

ThingsCloud事物云平台搭建-微信小程序

ThingsCloud云平台与微信小程序设计 本文主要是介绍ThingsCloud云平台的搭建及微信小程序与app的使用。 当前文章是作为一个通用案例,介绍如何快速使用 ThingsCloud云平台 以及 利用 ThingsCloud云平台平台的框架快速设计手机APP和微信小程序。 可以快速让硬件接入,实现硬件…...

为什么 uni-app 开发的 App 没有明显出现屏幕适配问题Flutter 开发的 App 出现了屏幕适配问题

🧩 一、为什么 uni-app 开发的 App 没有明显出现屏幕适配问题? ✅ 1. uni-app 是基于 H5 的运行环境(或类 H5) uni-app 默认使用的是 H5 的渲染引擎(如 WebView 或小程序渲染引擎)。在 H5 中,…...

学习路之php--性能优化

一、php周边优化 二、代码级优化 变量管理‌ 及时unset()释放大数组/对象,减少内存占用局部变量访问速度比全局变量快约2倍,优先使用局部变量大数组采用引用传递(&$var)避免内存 循环优化‌ 预计算循环次数: …...

GC1808:高性能24位立体声音频ADC芯片解析

1. 芯片简介 GC1808 是一款24位立体声音频模数转换器(ADC),支持96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于家庭影院、蓝牙音箱等场景。 核心特性 高精度:24位分辨率,…...

echarts使用graph、lines实现拓扑,可以拖动增加effect效果

options.js // import React from react // import * as echarts from echartsimport ./index.lessexport const useEchartsOptionFun ({ nodeDataList, getNodeLinksDataList, getLinesCoordsFun }) > {const option {title: {text: 拓扑关系图,top: top,left: center,}…...

产品经理课程(九)

从需求到功能设计 (一)复习 产品规划:产品定位、阶段性计划 产品定位:产品画布(9个步骤;最重要的是先解决什么问题) (Roadmap)目标要素:时间、事项、里程碑…...

二.单例模式‌

一.单例模式的定义 单例模式是一种‌创建型设计模式‌,确保一个类‌只有一个实例‌,并提供该实例的‌全局访问点‌。 1.1.核心目标 唯一实例‌:限制类的实例化次数仅一次。‌全局访问‌:提供统一的访问入口(通常是静…...

从零开始开发纯血鸿蒙应用之网络检测

从零开始开发纯血鸿蒙应用 〇、前言一、认识 connection 模块1、获取默认网络2、获取网络能力信息3、解析网络能力信息3.1、NetCap3.2、NetBearType 二、实现网络检测功能1、申请权限2、获取默认网路的 NetCap 数组 三、总结 〇、前言 在之前的博文里,介绍了如何实…...

向 AI Search 迈进,腾讯云 ES 自研 v-pack 向量增强插件揭秘

作者:来自腾讯云刘忠奇 2025 年 1 月,腾讯云 ES 团队上线了 Elasticsearch 8.16.1 AI 搜索增强版,此发布版本重点提升了向量搜索、混合搜索的能力,为 RAG 类的 AI Search 场景保驾护航。除了紧跟 ES 官方在向量搜索上的大幅优化动…...

接IT方案编写(PPT/WORD)、业务架构设计、投标任务

1、IT 方案编写(PPT/WORD)​ 定制化方案:根据客户需求,提供涵盖云计算、大数据、人工智能等前沿技术领域的 PPT/WORD 方案编写服务,精准提炼核心价值,呈现专业技术内容。​ 逻辑清晰架构:采用…...

PostgreSQL 的扩展pageinspect

PostgreSQL 的扩展pageinspect pageinspect 是 PostgreSQL 提供的一个强大的底层扩展,允许数据库管理员和开发者直接检查数据库页面的内部结构。这个扩展对于数据库调试、性能优化和深入学习 PostgreSQL 存储机制非常有价值。 一、扩展概述 功能:提供…...

Unity——QFramework框架 内置工具

QFramework 除了提供了一套架构之外,QFramework 还提供了可以脱离架构使用的工具 TypeEventSystem、EasyEvent、BindableProperty、IOCContainer。 这些工具并不是有意提供,而是 QFramework 的架构在设计之初是通过这几个工具组合使用而成的。 内置工具…...

【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作

在主机A pycharm如何连接远程主机B win docker? 需要win docker配置什么? 快捷配置-主机B win OpenSSH SSH Server https://blog.csdn.net/z164470/article/details/121683333 winR,打开命令行,输入net start sshd,启动SSH。 或者右击我的电脑&#…...

股指期货波动一个点多少钱?

很多朋友在交易股指期货时,都会好奇一个问题:股指期货波动一个点,我的账户里到底是赚了还是亏了多少钱?要搞清楚这个问题,其实很简单,只需要了解两个关键信息:股指期货的“交易单位”&#xff0…...

Kafka 快速上手:安装部署与 HelloWorld 实践(一)

一、Kafka 是什么?为什么要学? ** 在大数据和分布式系统的领域中,Kafka 是一个如雷贯耳的名字。Kafka 是一种分布式的、基于发布 / 订阅的消息系统,由 LinkedIn 公司开发,后成为 Apache 基金会的顶级开源项目 。它以…...

NGINX `ngx_stream_core_module` 模块概览

一、模块定位与功能 通用 TCP/UDP 代理 支持同时处理 TCP 和 UDP 流量,透明转发请求到后端服务器组(upstream)。可作为四层负载均衡,根据客户端 IP、权重、最少连接等策略将连接分发给后端。 预读(preread&#xff09…...

iOS、Android、鸿蒙、Web、桌面 多端开发框架Kotlin Multiplatform

Kotlin Multiplatform(简称 KMP)是 JetBrains 推出的开源跨平台开发框架 Kuikly 是腾讯开源的跨端开发框架,基于 Kotlin Multiplatform 技术构建,为开发者提供了技术栈更统一的跨端开发体验 KMP 不仅局限于移动端,它…...