尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
android AMS 详解
Android AMSActivity Manager Service详解一、AMS 是什么AMSActivity Manager Service是 Android 系统中最核心的服务之一负责管理四大组件Activity、Service、BroadcastReceiver、ContentProvider的生命周期和调度以及进程管理、任务栈管理、权限检查等。它运行在system_server进程中是 Framework 层的核心服务。二、AMS 的核心职责职责说明Activity 管理启动、暂停、恢复、销毁 Activity管理任务栈和返回栈Service 管理启动、绑定、解绑、停止 ServiceBroadcast 管理发送、接收有序/无序广播进程管理启动新进程、回收低优先级进程LRU 列表任务栈管理管理 Task 和 Activity 的启动模式权限检查验证调用者是否有权限执行操作ANR 检测监控主线程响应超时三、AMS 的架构位置┌─────────────────────────────────────┐ │ 应用层 (App) │ ├─────────────────────────────────────┤ │ ActivityManager (Java API) │ ├─────────────────────────────────────┤ │ ActivityManagerNative (AIDL) │ ├─────────────────────────────────────┤ │ ActivityManagerService (system_server) │ │ ├─ ActivityStackSupervisor │ │ ├─ ActivityStack │ │ ├─ ProcessRecord │ │ └─ ... │ ├─────────────────────────────────────┤ │ Zygote 进程孵化 │ ├─────────────────────────────────────┤ │ Linux Kernel │ └─────────────────────────────────────┘四、核心类与数据结构1. ActivityManagerServiceAMS 的主类继承自IActivityManager.Stub通过 Binder 暴露服务接口。2. ActivityStackSupervisor管理所有 Activity 栈的调度器Android 4.4 引入用于支持多窗口和多用户。3. ActivityStack管理一个任务栈维护ActivityRecord列表。4. ActivityRecord代表一个 Activity 实例包含infoActivityInfomanifest 信息task所属的 TaskRecordstate当前状态INITIALIZING、RESUMED、PAUSED 等app绑定的 ProcessRecord5. TaskRecord代表一个任务Task包含多个 ActivityRecord。6. ProcessRecord代表一个运行中的进程包含pid进程 IDuid用户 IDthread应用主线程的 IApplicationThread Binder 代理activities该进程中运行的 Activity 列表五、Activity 启动流程重点以startActivity()为例完整流程如下App (调用方) ↓ Binder IPC ActivityManagerService.startActivity() ↓ ActivityStarter.execute() ← Android 7.0 将启动逻辑抽离到 ActivityStarter ↓ ActivityStackSupervisor.startSpecificActivityLocked() ↓ 判断目标进程是否存在 ├── 否 → startProcessLocked() → 通过 Zygote fork 新进程 │ → 创建 ApplicationThread → attachApplication() │ └── 是 → 直接使用已有进程 ↓ ActivityStack.startActivityLocked() ↓ ActivityStack.resumeTopActivityInnerLocked() ↓ ActivityStackSupervisor.realStartActivityLocked() ↓ Binder IPC (跨进程调用) ApplicationThread.scheduleLaunchActivity() ← 进入目标 App 进程 ↓ ActivityThread.handleLaunchActivity() ↓ Instrumentation.newActivity() ← 反射创建 Activity 实例 ↓ Activity.attach() ← 创建 PhoneWindow、WindowManager ↓ Activity.onCreate() Activity.onStart() Activity.onResume() ↓ WindowManager.addView() ← 将 DecorView 添加到窗口六、进程优先级与 LRU 管理AMS 使用oom_adj值管理进程优先级值越大越容易被杀死优先级oom_adj说明FOREGROUND_APP0前台 ActivityVISIBLE_APP1可见但不可交互PERCEPTIBLE_APP2可感知前台 Service、音乐播放等BACKUP_APP3备份进程HEAVY_WEIGHT_APP4重量级后台SERVICE5后台 ServiceHOME_APP6Home 进程PREVIOUS_APP7上一个前台应用SERVICE_B8长时间运行的 ServiceCACHED_APP9缓存进程空进程AMS 维护LRULeast Recently Used列表当内存不足时按优先级从低到高回收进程。七、启动模式LaunchModeAMS 通过launchMode和Intent Flag控制 Activity 的启动行为模式说明standard每次启动都创建新实例singleTop栈顶复用否则新建singleTask栈内复用清空其上所有 ActivitysingleInstance独占一个任务栈AMS 内部通过ActivityStarter.computeLaunchingTaskFlags()计算最终启动标志。八、ANR 检测机制AMS 在以下场景检测 ANRService ANRServiceTimeout前台 20s后台 200sBroadcast ANRBroadcastTimeout前台 10s后台 60sInput ANR输入事件 5s 未处理ContentProvider ANR发布超时 10s实现原理AMS 通过Handler发送延迟消息若超时前未收到完成回调则触发 ANR。九、AMS 初始化流程system_server启动时初始化 AMSjava// SystemServer.java private void startBootstrapServices() { // 1. 创建 AMS 实例 mActivityManagerService mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); // 2. 设置系统进程 mActivityManagerService.setSystemProcess(); } private void startOtherServices() { // 3. 安装系统 ContentProvider mActivityManagerService.installSystemProviders(); // 4. 系统就绪 mActivityManagerService.systemReady(() - { // 启动 Home Activity }); }十、关键源码路径文件说明frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javaAMS 主类frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java栈管理器frameworks/base/services/core/java/com/android/server/am/ActivityStack.java任务栈frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java启动逻辑frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java进程记录frameworks/base/services/core/java/com/android/server/am/ActivityRecord.javaActivity 记录frameworks/base/core/java/android/app/ActivityThread.java应用主线程frameworks/base/core/java/android/app/Instrumentation.java生命周期回调十一、AMS 与相关服务的关系┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ AMS │◄───►│ WMS │ │ PMS │ │ (组件调度) │ │ (窗口管理) │ │ (包管理) │ └──────┬──────┘ └─────────────┘ └─────────────┘ │ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Zygote │ │ BMS │ │ PKMS │ │ (进程孵化) │ │ (电池管理) │ │ (权限管理) │ └─────────────┘ └─────────────┘ └─────────────┘
RELATED

相关推荐

免费开源的IT资产管理系统 Snipe-IT 实战部署:从零搭建到日常运维只需 3 步

免费开源的IT资产管理系统 Snipe-IT 实战部署:从零搭建到日常运维只需 3 步

免费开源的IT资产管理系统 Snipe-IT 实战部署:从零搭建到日常运维只需 3 步 【免费下载链接】snipe-it A free open source IT asset/license management system 项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it 在接手公司资产管理的第一个月&a…

📅 2026/10/6 13:07:20
深度理解CartoCSS选择器:从基础语法到高级地图数据过滤

深度理解CartoCSS选择器:从基础语法到高级地图数据过滤

深度理解CartoCSS选择器:从基础语法到高级地图数据过滤 【免费下载链接】carto fast CSS-like map stylesheets 项目地址: https://gitcode.com/gh_mirrors/ca/carto CartoCSS是一种强大的地图样式表语言,它通过类CSS的选择器语法让开发者能够精确…

📅 2026/10/10 4:34:03
iOS越狱入门必备:ios.cfw.guide教你认识4种核心越狱类型

iOS越狱入门必备:ios.cfw.guide教你认识4种核心越狱类型

iOS越狱入门必备:ios.cfw.guide教你认识4种核心越狱类型 【免费下载链接】ios.cfw.guide A complete iOS modding guide, from stock to jailbroken. 项目地址: https://gitcode.com/gh_mirrors/io/ios.cfw.guide ios.cfw.guide是一份完整的iOS修改指南&…

📅 2026/9/7 4:46:51
MORE NEWS

更多资讯

📰

Windows原生系统备份与恢复实战指南

1. 项目概述:这不是“ Ghost”软件,而是Windows原生系统备份能力的深度唤醒“Windows System Ghost”这个标题,乍看容易让人联想到早年流行的第三方克隆工具,但我要先说清楚:这里不涉及任何第三方Ghost软件&#xff0c…

📰

让爬虫学会自己缓一缓:可观测与自愈机制实战

干爬虫这行,最折磨人的从来不是写解析、调并发,而是爬虫“死”了你不知道。今天的采集成功率还是99%,明天一觉醒来发现数据全断在两个小时前——源站悄悄把接口加了一道人机校验,或者某个页面改版,解析规则整片失效。这…

📰

SpringBoot协同过滤旅游推荐系统:算法落地与毕设答辩全攻略

每年到了毕业设计的中期阶段,后台收到私信里至少三分之一都跟同一个主题有关——Springboot协同过滤算法的旅游推荐系统这类毕设项目。源码有了、数据库脚本有了、开发环境也铺好了,但很多人卡在“系统跑不起来”和“答辩讲不清算法”两个坎上。我最近刚…

📰

Java异常处理入门:从崩溃到优雅,掌握try-catch与throws

学Java的时候,第一次被“异常”拦住,多半是这种场面:你写了个让用户输入数字的小程序,自己测试时老老实实输了“3”,程序跑得欢天喜地。结果某天别的小朋友或者同事手一抖,输了个“abc”,控制台…

📰

GEO生成式引擎优化:从被引用到被转化的企业级落地指南

1. 从“关键词排名”到“答案占有率”:GEO到底在解决什么问题如果你在2026年还在用传统SEO的思维做流量,大概率会发现一个很尴尬的现象:官网的自然搜索排名明明还在前三页,但来自搜索渠道的询盘量却像被抽水机抽走了一样&#xff…

📰

医院排班系统开发实战:Spring Boot+MySQL排班算法与数据库设计

简介:这是一份 Java 医院排班系统源码包,基于 Spring Boot、Vue 和 MySQL 技术栈开发,采用 B/S 架构,主要面向医院管理人员和医护工作者,解决排班管理信息化、规范化问题,同样适合 Java 学习者用于毕业设计…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬