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.hqwc.cn/news/62995.html

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

相关文章

Kubernetes(K8s)入门

一、Kubernetes是什么 Kubernetes是什么? 首先,它是一个全新的基于容器技术的分布式架构领先方案。这个方案虽然还很新,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果。确切地说,Kubernetes是谷歌严格保密十几年的…

纯鸿蒙!华为HarmonyOS NEXT不再兼容安卓应用,无法安装Apk文件

8月7日消息,近日,华为举行2023年华为开发者大会(HDC.Together)上,除了发布HarmonyOS 4、全新升级的鸿蒙开发套件外,华为还带来了HarmonyOS NEXT开发者预览版。 据了解,HarmonyOS NEXT开发者预览…

vue 全局状态管理(简单的store模式、使用Pinia)

目录 为什么使用状态管理简单的store模式服务器渲染(SSR) pinia简介示例1. 定义一个index.ts文件2. 在main.ts中引入3. 定义4. 使用 storeToRefs 为什么使用状态管理 多个组件可能会依赖同一个状态时,我们有必要抽取出组件内的共同状态集中统…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

PHP最简单自定义自己的框架view使用引入smarty(8)--自定义的框架完成

1、实现效果。引入smarty, 实现assign和 display 2、下载smarty,创建缓存目录cache和扩展extend 点击下面查看具体下载使用,下载改名后放到extend PHP之Smarty使用以及框架display和assign原理_PHP隔壁老王邻居的博客-CSDN博客 3、当前控…

解决:django设置DEBUG=false时出现的问题

首先,我用的是django4.2,python3.10版本 本来,如果在settings.py中使用 DEBUG True,那么什么问题也没有,当然,这属于调试模式。 DEBUG True TEMPLATE_DEBUG DEBUGSTATIC_URL /static/ STATICFILES_DI…

Java SPI机制详解-01

1. 概述 SPI(Service Provider Interface),是 Java 6 引入了一个内置功能,实现服务提供发现和加载机制,使之与特定接口的匹配。 SPI 机制的核心思想就是 解耦 ,将装配的控制权移到程序之外,这…

数学符号说明——三角等号(≜)

三角等号 ,LaTex语法宏 (\triangleq),Unicode(U225C),又称 "delta equal to(Δ 等)"。可以读作 "等于"、"根据定义 x 等于 y "。 有时候,用在数学(和物理学)的某种定义中。例如&#…

9.2.1Socket(UDP)

一.传输层: 1.UDP:无连接,不可靠,面向数据报,全双工. 2.TCP:有连接,可靠,面向字节流,全双工. 注意:这里的可不可靠是相对的,并且和安不安全无关. 二.UDP数据报套接字编程: 1.socket文件:表示网卡的这类文件. 2.DatagramPacket:表示一个UDP数据报. 三.代码实现: 1.回显服务…

通过PostMan监视提交文件,验证web文件传输

切换文件流,传输文件 找到图片地址 发送请求然后接受 再来一张 哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏 Thanks♪(・ω・)ノ

Azure Kinect DK + ROS1 Noetic使用教程

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

Java基础入门篇——修饰符

在Java中,修饰符(Modifiers)是一种用于修改类、方法、变量和其他实体的访问权限、行为或特性的关键字。Java提供了一组修饰符,可以用于实现对代码的封装、继承、多态和访问控制等功能。 1、访问修饰符(Access Modifie…