【Android】AMS(三)APP启动流程

news2025/2/25 0:37:23

启动方式

在 Android 系统中,启动一个应用程序可以分为三种启动方式:热启动冷启动温启动。它们分别表示了不同的启动方式和启动过程。

热启动

热启动是指在已经打开并处于后台运行的应用程序中,再次通过图标进入应用程序的启动方式。这时应用程序的进程已经存在,系统只是将应用程序从后台调到前台,会尽可能地重用上一次打开的 Activity 实例以及其他资源,启动速度最快。

冷启动

冷启动是指启动一个之前没有启动过的应用程序。这种启动方式需要重新启动应用的进程,重新加载所有资源。在这个过程中,系统会进行以下步骤:

加载应用程序的代码和资源文件;
创建应用程序进程并启动其主线程;
执行 Application 的 onCreate 方法;
加载启动 Activity 的布局文件,创建 Activity 实例并执行 onCreate 方法。
由于启动过程中需要重新加载资源,因此冷启动的时间较长。

温启动

温启动是指在应用程序处于后台运行时,重新启动它。这种启动方式与热启动类似,但是由于应用程序在后台运行时,其占用的系统资源可能已经被清理或放入休眠状态,因此相对于热启动,温启动还需要额外的资源来唤醒应用程序进程和其他资源,启动速度较慢。


Activity 与任务(Task)的关系

一个 Activity 只能属于一个任务,但一个任务可以包含多个 Activity。这些 Activity 组成了一个栈,在一个任务中,它们按照启动时间的先后顺序排列,称为任务栈。最后启动的 Activity 位于栈的最上方显示,用户可以看到它。在用户按下返回按钮时,当前 Activity 将会被销毁并出栈,系统会显示出上一个 Activity。


启动模式

Android 提供了多种启动模式和 Intent 标记,我们可以通过它们来控制 Activity 的启动方式和与栈的交互方式,以满足不同的业务需求。例如,常见的启动模式包括 standardsingleTopsingleTasksingleInstance

当我们启动一个新的 Activity 时,Android 系统会根据启动模式和Manifest文件中的配置规则来决定如何创建和管理 Activity。

如果启动模式为 standard,则会在当前任务栈中启动一个新的 Activity,并将其放在栈的顶部;

如果启动模式为 singleTop,则会查找当前任务栈顶部是否已经存在相同类型的 Activity,如果存在,则直接调用该 Activity 的 onNewIntent 方法,并将其置顶;

如果启动模式为 singleTask,则系统会检查当前存在的任务栈中是否已经存在相同类型的 Activity,如果存在,则直接切换到该任务栈并将其位于栈顶,如果不存在,则新建一个任务栈并将该 Activity 放入其中;

如果启动模式为 singleInstance,则相当于 singleTask,但是它会单独创建一个新的任务栈,并且该任务栈中只能存在一个该类型的 Activity。


Intent 标记(Flags)

在 Android 开发中,Intent 是一种用于描述某个动作或意图的对象,可以用来启动 Activity、启动 Service、发送广播等操作。而 Intent 标记(Flags)则是用来修改 Intent 的行为的一种机制,可以通过添加标记来改变 Intent 的默认行为,例如改变启动模式、设置 Intent 的优先级等。

常见的 Intent 标记包括:

FLAG_ACTIVITY_NEW_TASK

该标记通常与启动 Activity 时一起使用,用于将新的 Activity 放入一个新的任务栈中,并使其成为栈顶的 Activity。如果该 Activity 已经存在于任务栈中,则会使该 Activity 后面的 Activity 出栈并销毁。

FLAG_ACTIVITY_CLEAR_TOP

该标记用于启动一个 Activity 后,清空该 Activity 顶部所有的 Activity,使得当前 Activity 位于该任务栈的栈顶。

FLAG_ACTIVITY_SINGLE_TOP

该标记用于启动一个 Activity 后,如果该 Activity 已经位于任务栈的栈顶,则不再创建新的 Activity,直接调用该 Activity 的 onNewIntent 方法。

FLAG_ACTIVITY_NO_HISTORY

该标记用于启动一个 Activity 后,使得该 Activity 不保留在任务栈中,当用户离开该 Activity 时,该 Activity 会被销毁并移出任务栈。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

该标记用于启动一个 Activity 后,将该 Activity 从“最近使用应用程序”列表中移除,不会显示在系统的任务切换器中。

FLAG_ACTIVITY_BROUGHT_TO_FRONT

该标记用于启动一个 Activity 后,如果该 Activity 已经存在于任务栈中,将该 Activity 移动到任务栈的前台。

FLAG_ACTIVITY_CLEAR_TASK

该标记用于启动一个 Activity 后,清空当前任务栈中的所有 Activity,并将该 Activity 放入任务栈的底部。通常与 FLAG_ACTIVITY_NEW_TASK 一起使用。

FLAG_ACTIVITY_REORDER_TO_FRONT

该标记用于启动一个 Activity 后,将该 Activity 移动到任务栈的前台,并调整其它 Activity 的位置,以满足其在栈中的新位置。


APP启动流程

在这里插入图片描述

当启动一个新的 Android 应用程序时,系统会经历以下步骤:

1.点击程序图标

Android 系统会根据应用程序的包名和要启动的 Activity 名称创建一个 Intent 对象,并将该 Intent 对象发送给 AMS(ActivityManagerService)。这个过程实际上是通过 Binder 机制进行实现的。AMS 是 Android 系统中一个系统服务,负责管理 Activity 组件的生命周期。由SystemService启动AMS。

2.判断程序是否存在

当 AMS 接收到启动应用程序的 Intent 对象后,会检查该 Intent 对象所要启动的应用程序进程是否已经存在。如果已经存在,则 AMS 会直接通过 Binder 与该进程进行通信;否则会通过Socket通知Zygote 进程,Zygote 作为孵化器,会Fork创建新的应用程序进程。

3.进程绑定

在新的应用程序进程中,AMS 会与 ActivityThread 通过 Binder 进行绑定。ActivityThread 是 Android 系统中的主线程,它负责将用户的操作转化为对应的任务,然后将任务分发给具体的组件进行处理。在绑定完成之后,AMS 会向 ActivityThread 发送一个 BIND_APPLICATION 命令,由 ActivityThread 进行处理。

4.发送启动应用程序命令

在 ActivityThread 中,系统会先调用 Looper.prepare() 方法创建消息循环队列,然后通过 ApplicationThreadProxy 向 AMS 发送一个启动应用程序的命令。AMS 收到该命令后会检查当前应用程序进程的状态,确定该进程是否处于空闲状态。如果是,AMS 会通过 Binder 向应用程序进程发送一个 LAUNCH_ACTIVITY 命令,并附带要启动的 Activity 对象。

5.创建任务栈

在应用程序进程中,通过 AMS 传来的 Activity 对象,系统会调用该 Activity 的构造函数进行初始化,并将该 Activity 添加到任务栈中。如果任务栈不存在,则会新创建一个任务栈。

6.处理任务

系统会根据该 Activity 的启动模式以及任务栈的状态,确定该 Activity 在任务栈中的位置。然后会将该 Activity 对象封装成 Intent 对象,并通过 Binder 机制发给 AMS。AMS 收到该 Intent 后,会检查该 Intent 所对应的任务栈是否在前台,如果在前台则不做处理,否则 AMS 会将该 Intent 封装成 ActivityStack 事件并放入消息队列中等待处理。

7.创建Activity

在 ActivityThread 中,当处理到该事件时,系统会调用 Instrumentation 的 callActivityOnCreate 方法,开始创建该 Activity 的视图布局。此后,系统会按照生命周期顺序依次调用各个方法,例如 onResume、onPause 等,直至该 Activity 销毁。


Activity的启动流程

应用程序中启动一个新的 Activity 时,系统会经历以下步骤:

1.在当前Activity中调用startActivity()方法,将要启动的Activity类的类名封装为Intent对象,并调用startActivity()方法发送Intent。

2.系统会根据Intent中的信息,通过PackageManager(包管理器)查询该Activity的信息,包括Activity所在的应用程序的包名、Activity的启动模式以及其他信息。

3.判断该Activity是否要启动到新的任务栈中,如果不是,将该Activity对象压入目标任务栈的栈顶。否则AMS(ActivityManagerService)会创建一个新的任务栈,并将该Activity对象压入该任务栈中;AMS实通过调用ActivityStackSupervisor的createStack()方法来创建新的Activity栈,并把该栈添加到ActivityStackSupervisor中维护的栈列表中。

4.AMS会将该Activity对象封装成Intent对象(包括AMS创建的任务栈的唯一标识符,用于标识该任务栈的ID)。并通过Binder机制发送给应用程序进程,由ActivityThread进行处理。

5.在应用程序进程中,ActivityThread接收到AMS发送来的Intent后,会根据Intent中的信息,创建一个新的Activity实例,ActivityThread会根据AMS返回的任务栈ID,来确定新Activity所在的任务栈。如果任务栈ID为-1,说明该Activity不需要启动到新的任务栈中,而是在当前任务栈中启动。否则,ActivityThread会将该Activity的启动标志设置为“FLAG_ACTIVITY_NEW_TASK”,这样就会启动到一个新的任务栈中。调用其onCreate()方法进行初始化。此时,该Activity还没有显示出来,只是存在于内存中。

6.最后,系统会调用新启动的Activity的onStart()onResume()方法,让其显示出来并进入可见状态。


APP启动流程和Activity启动流程有什么相同点和不同点

相同点:

都需要经过AMS(Activity Manager Service)进行统一调度和管理。

都需要在应用程序进程中创建相应的组件实例,并进行初始化。

在启动过程中都需要通过Intent来传递相应的参数和信息。

不同点:

App启动流程是整个应用程序从闲置状态到完全启动运行的流程,包含了多个Activity的启动和相应服务、广播等组件的启动;而Activity启动流程是单个Activity的启动过程。

App启动流程涉及到的组件较为复杂,包括了Application、Activity、Service等多种组件类型的启动和运行;而Activity启动流程是指在Activity栈中启动一个新的Activity实例。

App启动流程通常是由系统启动,或者由用户手动触发启动;而Activity启动流程则是由当前Activity中的代码主动调用startActivity()方法来触发启动。

在启动过程中,App需要先执行Application的onCreate()方法,然后才会启动第一个Activity;而Activity的启动过程则是直接调用所需Activity的onCreate()方法。

在启动过程中,App会经历多个Activity的启动和销毁过程,会涉及到Activity栈和任务栈等概念;而Activity的启动流程则只关注单个Activity的启动过程。


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

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

相关文章

Spring Security OAuth停更了?探索官方进化版Spring Authorization Server的革新之处!

1、背景 Spring Security OAuth(spring-security-oauth2)停更 主要意思是:生命周期终止通知 Spring Security OAuth(spring-security-oauth2)项目已达到生命周期结束,不再由VMware,Inc.积极维护。 此项目已被Spring Security和Spring Author…

信创办公–基于WPS的EXCEL最佳实践系列 (设置多级列表)

信创办公–基于WPS的EXCEL最佳实践系列 (设置多级列表) 目录 应用背景操作步骤1、删除重复项2、部门绑定3、填入相关信息 应用背景 当我们在使用电子表格时,很多类型重复输入很麻烦,看起来也很复杂,我们就可以设置多级…

关于输入输出格式符的测试

对输出%m.nf的测试 m代表宽度,表示数据可以占m列n代表精确,表示小数占n列 以下用%6.3f进行测试,有两个问题: 1、这个m是包括小数点位数吗?(todo未果) 2、精确度n超过了是怎么处理的&#xff1f…

2023年第六届广西大学生程序设计竞赛(正式赛)题解

比赛题目链接,可以继续提交代码: 2023年第六届广西大学生程序设计竞赛(正式赛) | 知乎:如何评价第六届广西大学生程序设计竞赛? 难度题号备注签到题A J K已给出题解和代码普通题B D E H已给出题解和代码中等题C G–难题F I L M–…

机器学习方法在生态经济学领域中的应用

查看原文>>>基于R语言机器学习方法在生态经济学领域中的实践技术 近年来,人工智能领域已经取得突破性进展,对经济社会各个领域都产生了重大影响,结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c…

moviepy快速切分视频并保存片段

文章目录 1、直接使用ffmepg2、使用moviepy本身 moviepy安装最新版本: pip install moviepy --pre --upgrade版本是v2.0.0.dev2。 有两种方法一种快速的: 1、直接使用ffmepg from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip ffmpeg…

Lecture 12 Discourse

目录 Discourse 语篇三个关键的语篇任务Discourse Segmentation 语篇分段Unsupervised Approaches 无监督方法Supervised Approaches 有监督方法有监督语篇分段器Discourse Analysis 语篇解析语篇解析RST: Discourse UnitsRST: Discourse RelationsNucleus vs. Satellite 核心 …

2022计算机系统期末

直接导入无图片,先不改了,不过图片都是原题目,不影响对答案。 计算机系统2022期末 本课程的复习请以知识点复习为重,全部内容共有大小280个知识点,都可能在期末考试出现,仅通过往年试卷复习是远远不够的&…

从小白到大神之路之学习运维第35天---第三阶段---mysql数据库之主从复制配置

第三阶段基础 时 间:2023年6月7日 参加人:全班人员 内 容: Mysql数据库之主从复制配置 目录 前提环境配置 MySQL 5.7 版本的主从复制配置步骤 主 库 1. 在主库上开启二进制日志记录功能 2. 在主库上创建一个用于从库访问的备份用户 3. 在主…

VTK学习之光照和相机

目录 一、VTK光照 1、关于vtkLight常用的方法 2、最终效果 二、相机设置 1、相机设置 2、效果 一、VTK光照 通过设置光照,可以达到不同颜色的目的,参考博客: VTK修炼之道7_三维场景基本要素:光照_vtk 光照_沈子恒的博客-CSDN博客 1…

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--02 Guidelines

02 Guidelines 本节将配合代码,介绍一些构建Prompt的基本原则和策略。 1) OpenAI API 首先开发者需要在OpenAI网站(https://platform.openai.com/account/api-keys)注册一个key,然后通过pip install openai安装openai三方库,再将key导入当…

Express路由

一、目标 能够使用express.static()快速托管静态资源能够使用express路由精简项目结构能够使用常见的express中间件能够使用express创建API接口能够在express中启用cors跨域资源共享 二、目录 初始ExpressExpress路由Express中间件使用Express写接口 1.1Express简介 1.什么…

微信小程序原生开发功能合集二十:导航栏、tabbar自定义及分包功能介绍

本章实现导航栏及tabbar的自定义处理的相关方法介绍及效果展示。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/detail/37977    2. 5…

uCOSii系统的中断管理

uCOSii系统的中断管理 1、在使用uCOSii系统时,中断服务程序需要调用两个函数OSIntEnter()和OSIntExit()。 OSIntEnter() 进入中断时,用OSIntNesting来统计中断嵌套次数,告知uCOSii系统,当前中断服务程序正在执行; OS…

Java实战和面试宝典

这是一篇记录工作和学习过程中遇到的一些问题的文章,每个问题都很有代表性,值得不断回顾和深入思考的,答案未必十分准确,但可以作为一种参考,共勉! 读了这篇不一样的八股文,你将至少拥有三年经…

社交媒体品牌:如何通过11个步骤提升您的战略

您是否正在努力在社交媒体上留下自己的印记?您是否觉得您的品牌在无尽的视频和表情包中迷失了方向?在本文中,我们将为您提供11个技巧,帮助您制定社交媒体品牌战略并脱颖而出。但首先,让我们探讨什么是社交媒体品牌&…

正版软件 | DaisyDisk:Mac 电脑一流的磁盘空间管理工具

使用 Mac 工作时,平时创建并下载大量文件,但很容易忘记或者很少删除这些内容。但是有一天,您发现启动磁盘已红,但是自己又好似没有安装啥软件,这时候就会想到底是哪些数据占用了这么大的空间?! …

【TA 100】2.3 HLSL常用函数介绍

一、基本数学运算 ● max(a,b) ○ 返回较大的 ● min(a,b) ○ 返回较小的 ● mul(a,b) ○ 两向量相乘,常用于矩阵运算 ● abs(a) ○ …

ThreeJS教程:地图案例(包围盒、正投影)

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 地图案例(包围盒、正投影) 地图案例(包围盒、正投影) 地图案例会涉及到几何体、包围盒、正投影相机三方面知识点。 平面填充几何体ShapeGeometry包围盒Box3正投影相机Orthograph…

MTK开发板-4G/5G联发科开发板相关方案定制

开发板是用于嵌入式系统开发的电路板,包括中央处理器、存储器、输入设备、输出设备、数据通路 / 总线和外部资源接口等一系列硬件组件。一般来说,开发板由嵌入式系统开发者根据开发需求自主定制,也可以由用户自己研究设计。开发板不仅是初学者…