Android系统组件——AMS,App启动中的AMS流程

news2024/10/3 10:40:37

AMS(Activity Manager Service)是Android系统中非常重要的一个组件,负责管理应用程序的生命周期、进程调度以及任务栈的管理等任务。本文将从AMS的原理、数据结构、SystemServer加载AMS以及App启动中的AMS流程等方面进行详细介绍,并通过代码示例进行解析。

一、AMS的原理

AMS作为Android系统的核心组件之一,扮演着重要的角色。它负责管理应用程序的生命周期,包括应用的启动、切换、销毁等操作。同时,AMS还负责进程调度,根据系统资源的使用情况来决定应用程序的优先级,以提高系统的整体性能。此外,AMS还负责任务栈的管理,用于管理应用程序的界面显示和切换。

二、AMS的数据结构

AMS内部使用了一些重要的数据结构来管理应用程序的生命周期、进程调度以及任务栈的管理等任务。其中最重要的数据结构包括ActivityStack、ProcessRecord、TaskRecord等。

  1. ActivityStack:用于管理应用程序的任务栈,每个ActivityStack对应一个任务栈,用于存储应用程序的Activity实例。ActivityStack中维护了一个栈结构,用于记录Activity的启动顺序和切换顺序。
  2. ProcessRecord:用于管理应用程序的进程,每个ProcessRecord对应一个应用程序的进程。ProcessRecord中存储了应用程序的包名、进程名、进程ID等信息,以及该进程中运行的Activity实例。
  3. TaskRecord:用于管理应用程序的任务,每个TaskRecord对应一个应用程序的任务,用于存储应用程序的Activity实例。TaskRecord中维护了一个栈结构,用于记录Activity的启动顺序和切换顺序。

三、SystemServer加载AMS

在Android系统启动时,SystemServer作为系统服务的入口点,负责加载和启动各个系统服务,其中包括AMS。SystemServer首先会创建一个AMS实例,并将其注册为系统服务,然后启动AMS的主线程Looper,用于处理AMS的各种操作。

四、App启动中的AMS流程

当用户启动一个应用程序时,AMS负责处理应用程序的启动流程。下面是App启动中的AMS流程的简要概述:

  1. 用户点击应用程序的图标,系统会通过Launcher应用程序发送一个启动应用程序的请求给AMS。
  2. AMS接收到启动请求后,首先会检查应用程序是否已经运行。如果应用程序已经运行,则直接将应用程序的任务栈置于前台,并将最上层的Activity显示在屏幕上。
  3. 如果应用程序尚未运行,则AMS会根据应用程序的包名和启动Activity的类名创建一个新的进程,并将该进程添加到系统的进程列表中。
  4. AMS会在新的进程中创建一个ActivityThread实例,并通过Binder机制与该进程进行通信。
  5. ActivityThread负责处理应用程序的生命周期和界面显示等任务。在创建完ActivityThread实例后,AMS会调用ActivityThread的main方法启动该进程的主线程。
  6. 主线程启动后,ActivityThread会初始化应用程序的上下文环境,并加载应用程序的资源。然后,ActivityThread会调用Instrumentation的callApplicationOnCreate方法,通知应用程序的Application实例进行初始化操作。
  7. 应用程序的Application实例初始化完成后,ActivityThread会调用Instrumentation的newActivity方法创建启动Activity的实例,并将其添加到任务栈中。
  8. ActivityThread会调用Activity的onCreate方法,执行应用程序的初始化逻辑。在这个过程中,Activity可以加载布局、注册监听器等操作。
  9. 当Activity的onCreate方法执行完毕后,ActivityThread会调用Activity的onStart方法,使Activity进入可见状态。
  10. 最后,ActivityThread会调用Activity的onResume方法,使Activity进入前台并显示在屏幕上。

以上是App启动中的AMS流程的简要概述,通过AMS的管理和调度,应用程序的启动过程得以顺利进行。

五、App启动中的AMS流程解析

下面是一个简单的代码示例,演示了App启动中的AMS流程:

intent.setComponent(new ComponentName("com.example.myapp", "com.example.myapp.MainActivity"));
startActivity(intent);

在上述代码中,用户点击应用程序的图标后,通过Intent指定了启动应用程序的包名和启动Activity的类名。

AMS会接收到启动请求,并根据包名和类名创建一个新的进程:

processRecord.packageName = "com.example.myapp";
processRecord.processName = "com.example.myapp";
processRecord.pid = android.os.Process.myPid();

在新的进程中,AMS会创建一个ActivityThread实例,并启动主线程:

activityThread.main(new String[]{"com.example.myapp"});

在主线程中,ActivityThread会初始化应用程序的上下文环境,并加载应用程序的资源:

appContext.initResources();

ActivityThread会调用Instrumentation的callApplicationOnCreate方法,通知应用程序的Application实例进行初始化操作:

Application application = instrumentation.newApplication(appContext, MyApplication.class.getName(), null);
instrumentation.callApplicationOnCreate(application);

ActivityThread会调用Instrumentation的newActivity方法创建启动Activity的实例,并将其添加到任务栈中:

TaskRecord taskRecord = new TaskRecord();
taskRecord.addActivity(activity);

ActivityThread会依次调用Activity的onCreate、onStart和onResume方法,使Activity进入前台并显示在屏幕上:

activity.onStart();
activity.onResume();

通过以上代码示例,我们可以看到在App启动中的AMS流程中,AMS负责管理应用程序的生命周期、进程调度以及任务栈的管理等任务,而ActivityThread负责处理应用程序的生命周期和界面显示等任务。

全文AMS作为Android系统中的重要组件,扮演着管理应用程序生命周期、进程调度以及任务栈管理等关键角色。更多有关Android进阶技术的学习,可以参考《Android核心技术手册》里面包含1000个以上技术点,30多个技术板块。点击可查看详细类目。

六、总结

本文从AMS的原理、数据结构、SystemServer加载AMS以及App启动中的AMS流程等方面进行了详细介绍,并通过代码示例进行了解析。

通过对AMS的深入理解,我们可以更好地掌握Android开发中的应用程序管理和调度机制,从而提高应用程序的性能和用户体验。

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

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

相关文章

存储过程的学习

1,前言 这是实习期间学习的,我可能是在学校没好好听课,(或者就是学校比较垃,没教这部分,在公司经理让我下去自己学习,太难了,因为是公司代码很多部分都是很多表的操作&#…

UI美工设计岗位的工作职责

UI美工设计岗位的工作职责1 职责: 1、负责软件界面的美术设计、创意工作和制作工作; 2、根据各种相关软件的用户群,提出构思新颖、有高度吸引力的创意设计; 3、对页面进行优化,使用户操作更趋于人性化; 4、维护现有的应用产品; 5、收集和…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串,当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数,则返回的子字符串将…

项目经理一起趟过的那些“坑”

大家好,我是老原。 在项目管理这行,有很多项目经理的前身都是搞技术的,他们大多数是因为技术工作做得好而走上管理岗位。 然而,这样走来的技术领导,在刚晋升时,往往会面临很多问题,经历痛苦的…

【Opencv入门到项目实战】(九):项目实战|信用卡识别|模板匹配|(附代码解读)

所有订阅专栏的同学可以私信博主获取源码文件 文章目录 0.背景介绍1.模板处理1.1模板读取1.2预处理1.3轮廓计算 2.输入图像处理2.1图形读取2.2预处理2.3轮廓计算2.4计算匹配得分 3.小结 0.背景介绍 接下来我们正式进入项目实战部分,这一章要介绍的是一个信用卡号识…

TDesign中后台管理系统-用户登录

目录 1 创建用户表2 开发后端接口3 测试接口4 修改登录页面调用后端接口最终效果总结 中后台系统第一个要实现的功能就是登录了,我们通常的逻辑是让用户在登录页面输入用户名和密码,调用后端接口去验证用户的合法性,然后根据接口返回的结果进…

Qt 8. UDP客户端通信

1. 代码 //UdpClient.h #ifndef UDPCLIENT_H #define UDPCLIENT_H#include <QtNetwork>class Ex2; // 声明类 class UdpClient : public QObject {Q_OBJECT public:explicit UdpClient(Ex2 *ui nullptr);~UdpClient();void Send(QByteArray buf,QHostAddress addr…

腾讯云服务器远程连接的方法大全

腾讯云服务器怎么连接登录&#xff1f;腾讯云服务器支持多种远程连接方法&#xff0c;可以使用腾讯云管理控制台自带的远程连接工具&#xff0c;也可以使用第三方远程连接工具&#xff0c;如如PuTTY、Xshell等&#xff0c;Linux操作系统可以SSH登录&#xff0c;Windows可以使用…

半导体学习入门书籍推荐之《Verilog数字系统设计教程》

Verilog HDL&#xff08;简称 Verilog &#xff09;是一种硬件描述语言&#xff0c;用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog 继承了 C 语言的多种操作符和结构&#xff0c;与另一种硬件描述语言 VHDL 相比&#xff0c;语法不是…

JavaScript 操作历史记录api怎样使用 JavaScript

JavaScript 操作历史记录api怎样使用 JavaScript History 是 window 对象中的一个 JavaScript 对象&#xff0c;它包含了关于浏览器会话历史的详细信息。你所访问过的 URL 列表将被像堆栈一样存储起来。浏览器上的返回和前进按钮使用的就是 history 的信息。 History 对象包含…

数据库信息速递 -- MariaDB 裁员后,前景不确定 (翻译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群&#xff…

【算法挨揍日记】day01——双指针算法_移动零、 复写零

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

C语言之位运算

一、什么是位运算 所谓位运算是指进行二进制位的运算 在系统软件中&#xff0c;常要处理二进位的问题 例如&#xff0c;将一个存储单元中的各二进位左移或右移一位&#xff0c;两个数按位相加等 二、位运算符和位运算 1、按位与 运算符(&) 参加运算的两个数据&#xff…

单志刚的七年联盟链之路:在正确的方向,同行者总会相遇丨对话MVP

单志刚在联盟链的道路上已经坚守了7年。 从最初创业时期的“用字节开发”&#xff0c;到现在作为数金公共服务 (青岛) 有限公司&#xff08;下称“数金公服”&#xff09;区块链研发中心产品总监&#xff0c;落地全国首个以数字人民币结算的碳普惠平台“青碳行”App&#xff0…

PhotoShop2023 Beta AI版安装教程

从 Photoshop 开始&#xff0c;惊艳随之而来​ 从社交媒体贴子到修饰相片&#xff0c;设计横幅到精美网站&#xff0c;日常影像编辑到重新创造 – 无论什么创作&#xff0c;Photoshop 都可以让它变得更好。​ Photoshop2023 Beta版本安装教程和软件下载 地址&#xff1a;点击…

Redis:揭秘高效缓存与数据存储利器

Redis&#xff08;Remote Dictionary Server&#xff09;是一款开源的、内存数据结构存储系统&#xff0c;广泛应用于高性能缓存、消息队列、实时分析和计数器等场景。本文将深入探索Redis的重要概念、底层架构实现原理&#xff0c;指导程序员如何部署和使用Redis&#xff0c;并…

力扣70.爬楼梯(动态规划)

/*** author Limg* date 2023/08/11* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。* 每次你可以爬 1 或 2 个台阶。* 你有多少种不同的方法可以爬到楼顶呢&#xff1f; */#include<iostream> using namespace std; int climbStairs(int n); int main() {int n0;cin>&…

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目&#xff1a; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …

Floyd算法

正如我们所知道的&#xff0c;Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展&#xff0c;三个for循环就可以解决问题&#xff0c;所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下&#xff1a;从任意节点A到任意节点B的最短路径不外乎2种可能&#xff…

FreeRTOS(消息队列)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、消息队列的基本概念 1、消息队列的基本概念 2、消息队列的通信机制 3、FreeRTOS中消息队列特性 4、消息队列应用场景 二、消息队列常用API 1、使用消息队列的典型流程 三、消…