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

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.rhkb.cn/news/86116.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】105. 从前序与中序遍历序列构造二叉树

作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 105. 从前序与中序遍历序列构造二叉树 力扣 题目描述: 给定两个整数数组 preord…

小结:基于 JavaWeb 的宠物店管理系统

宠物店管理系统 系统介绍系统展示登录界面用户注册页面 店主主界面宠物信息管理页面修改宠物信息 宠物出入库管理页面宠物订单查询页面宠物账单查看页面用户信息管理页面修改用户信息 用户主界面宠物订购页面用户订购支付页面 个人资料编辑页面个人订单查看页面 系统说明开发环…

【力扣每日一题】2023.8.11 矩阵对角线元素的和

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个矩阵,让我们把矩阵对角线上的元素都加起来返回。 那么矩阵的对角线是有两条的,一条是从左上到右下…

CSS3 中新增了哪些常见的特性?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 圆角(Border Radius)⭐ 渐变(Gradients)⭐ 阴影(Box Shadow)⭐ 文本阴影(Text Shadow)⭐ 透明度(Opacity)⭐ 过渡&…

Azure Kinect DK + ROS1 Noetic使用教程

作者: Herman Ye Galbot Auromix 版本: V1.0 测试环境: Ubuntu20.04 更新日期: 2023/08/08 注1: 本文内容中的硬件由 Galbot 提供支持。 注2: Auromix 是一个机器人爱好者开源组织。 注3: 本文在…

当前服务器版本不支持该功能,请联系经销商升级服务器 - - 达梦数据库报错

当前服务器版本不支持该功能,请联系经销商升级服务器 - - 达梦数据库报错 环境介绍1 搭建测试环境2 报错内容3 标准版介绍 环境介绍 某项目使用标准版数据库中,使用insert into 正常操作表,插入数据时报错,表为普通表。 1 搭建测…

Maven: ‘mvn‘ is not recognized as an internal or external command

下载并配置好Maven之后,CMD测试安装是否成功:mvn -v 提示: mvn is not recognized as an internal or external command, operable program or batch file. 检查环境变量: MAVEN_HOME: %MAVEN_HOME%\bin: 看上去没问题&#x…

2.若依前后端分离版第一个增删查改

1.介绍 若依提供了代码生成功能,单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统,进入菜单[系统工具]-》[代码生成],点击导入按钮,选择需要生成代码的表进行导…

UML—浅谈常用九种图

目录 概述: 1.用例图 2.静态图 3.行为图: 4.交互图: 5.实现图: 概述: UML的视图是由九种视图组成的,分别是用例图、类图、对象图、状态图、活动图、序列图、协作图、构件图、实施图。我们可以根据这9种图的功能和实现的目的…

JavaWeb学习|JavaBean;MVC三层架构;Filter;Listener

1.JavaBean 实体类 JavaBean有特定的写法: 必须要有一个无参构造 属性必须私有化。 必须有对应的get/set方法 用来和数据库的字段做映射 ORM; ORM:对象关系映射 表--->类 字段-->属性 行记录---->对象 2.<jsp&#xff1a;useBean 标签 3. MVC三层架构 4. Filter …

如何调教让chatgpt读取自己的数据文件(保姆级图文教程)

提示&#xff1a;如何调教让chatgpt读取自己的数据文件(保姆级图文教程) 文章目录 前言一、如何投喂自己的数据&#xff1f;二、调教步骤总结 前言 chatgpt提示不能读取我们提供的数据文件&#xff0c;我们应该对它进行调教。 一、如何投喂自己的数据&#xff1f; 让chatgpt读…

华为Mate30报名鸿蒙 HarmonyOS 4.0.0.108 系统更新

华为 Mate 30 系列于 2019 年 11 月 1 日上市&#xff0c;包括 Mate 30 4G / 5G、Mate 30 Pro 4G / 5G、保时捷设计版 Mate30 共五款机型。华为 Mate 30 系列 5G 版搭载麒麟 990 5G 处理器&#xff0c;同时支持 SA 及 NSA 5G 双模&#xff0c;适配三大运营商的 5G / 4G / 3G / …

以mod_jk方式整合apache与tomcat(动静分离)

前言&#xff1a; 为什么要整合apache和tomcat apache对静态页面的处理能力强&#xff0c;而tomcat对静态页面的处理不如apache&#xff0c;整合后有以下好处 提升对静态文件的处理性能 利用 Web 服务器来做负载均衡以及容错 更完善地去升级应用程序 jk整合方式介绍&#…

【构建卷积神经网络】

构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别&#xff0c;需重新设计&#xff0c;训练模块基本一致 全连接层&#xff1a;batch784&#xff0c;各个像素点之间都是没有联系的。 卷积层&#xff1a;batch12828&#xff0c;各个像素点之间是有联系的。 impor…

将vsCode 打开的多个文件分行(栏)排列,实现全部显示,便于切换文件

目录 1. 前言 2. 设置VsCode 多文件分行(栏)排列显示 1. 前言 主流编程IDE几乎都有排列切换选择所要查看的文件功能&#xff0c;如下为Visual Studio 2022的该功能界面&#xff1a; 图 1 图 2 当在Visual Studio 2022打开很多文件时&#xff0c;可以按照图1、图2所示找到自…

Golang struct 结构体指针类型 / 结构体值类型

struct类型的内存分配机制 结构体变量之间的赋值是值拷贝。 type stu struct {Name stringSlice []stringMap1 map[string]string }func main() {s : stu{}s.Slice make([]string, 6)s.Slice[1] "ssss"s.Slice[2] "xxxx"s.Map1 make(map[string]stri…

基础堆排序

目录 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 基础堆排序

【Opencv入门到项目实战】(十):项目实战|文档扫描|OCR识别

所有订阅专栏的同学可以私信博主获取源码文件 文章目录 1.引言1.1 什么是光学字符识别 (OCR)1.2 应用领域 2.项目背景介绍3.边缘检测3.1 原始图像读取3.2 预处理3.3 结果展示 3.轮廓检测4.透视变换5.OCR识别5.1 tesseract安装5.2 字符识别 1.引言 今天我们来看一个OCR相关的文…

桂林小程序https证书

现在很多APP都相继推出了小程序&#xff0c;比如微信小程序、百度小程序等&#xff0c;这些小程序的功能也越来越复杂&#xff0c;不可避免的和网站一样会传输数据&#xff0c;因此小程序想要上线就要保证信息传输的安全性&#xff0c;也就是说各种类型的小程序也需要部署https…

怎么用PS的魔术棒抠图?PS魔术棒抠图的操作方法

使用PS的魔术棒抠图教程&#xff1a; 1、首先&#xff0c;在ps界面上方点击“文件”选项&#xff0c;再在其弹出的选项栏中选择“打开”选项。然后&#xff0c;打开你所需要的图片。 2、然后&#xff0c;单击左侧的“魔术棒”工具。 3、然后&#xff0c;用鼠标点击图片的背景&…