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

这篇具有很好参考价值的文章主要介绍了【Android】AMS(三)APP启动流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

启动方式

在 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】AMS(三)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的启动过程。文章来源地址https://www.toymoban.com/news/detail-474523.html


到了这里,关于【Android】AMS(三)APP启动流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从一个APP启动另一个APP的activity的方式

    1、通过自定义action启动 这种方式只需要在代码中设置一个action即可, 系统会自动过滤去找到这个action所对应的Activity 当前APP的代码 待启动APP 的activity在AndroidManifest.xml中的配置 2、通过在Intent中通过指定包名和类名来查找 直接在当前APP中写以下代码,即可打开指定APP的acti

    2024年02月08日
    浏览(48)
  • Android S从桌面点击图标启动APP流程 (六)

    系列文章 Android S从桌面点击图标启动APP流程 (一) Android S从桌面点击图标启动APP流程 (二) Android S从桌面点击图标启动APP流程 (三) Android S从桌面点击图标启动APP流程 (四) Android S从桌面点击图标启动APP流程 (五) Android 12的源码链接: android 12 aosp http://aospxref.com/android-12.0.0_r3/ 上文

    2024年02月06日
    浏览(45)
  • Android系统启动流程概览

    Boot Rom —— Bootloader —— Linux Kernel —— init进程 —— Zygote进程(dalvik/ art)—— systemServer —— Apps init 进程是Linux系统中,用户空间启动的第一个进程。 创建并挂载一些文件目录 启动属性服务 解析 init.rc 配置文件,启动 Zygote 进程 挂载 seLinux 文件目录,创建seLinux,加载

    2024年02月06日
    浏览(41)
  • Android系统启动流程分析

           当按下Android系统的开机电源按键时候,硬件会触发引导芯片,执行预定义的代码,然后加载引导程序(BootLoader)到RAM,Bootloader是Android系统起来前第一个程序,主要用来拉起Android系统程序,Android系统被拉起首先肯定会启动Linux内核。 备注: 我们再刷机时候,经常看到

    2024年02月15日
    浏览(44)
  • 笔记:Android 9系统启动流程

    当电源键按下时,引导芯片代码(汇编指令)会从预定的地方(固化在ROM)开始执行,将引导程序 BootLoader 加载到 RAM中,然后执行 BootLoader 是在 Android 操作系统开始前的一个小程序,主要作用是把系统OS拉起来并运行 位置: bootablebootloader 当 Linux系统被 BootLoader 程序拉起,

    2024年02月14日
    浏览(37)
  • Android系统启动流程 源码解析

    本文链接:https://blog.csdn.net/feather_wch/article/details/132518105 有道云脑图:https://note.youdao.com/s/GZ9d8vzO 1、整体流程 Boot Room BootLoader idle kthread init init ServiceManager zygote zygote SystemServer app 1、kernel/common/init/main.c 2、andorid.mk-android.bp编译 3、init是用户空间鼻祖 属于C、C++ Framework 1.1 启动源

    2024年02月11日
    浏览(46)
  • Android T 远程动画显示流程其二——系统侧动画启动流程

    接着上篇文章分析 Android T 远程动画显示流程其一 下面,我们以从桌面点击一个应用启动的场景来分析远程动画的流程,窗口添加的流程见Android T WMS窗口相关流程 这里我们从AppTransitionController.handleAppTransitionReady方法开始跟踪代码流程 代码路径:framework/services/core/java/com/and

    2024年03月28日
    浏览(43)
  • android 13 WMS/AMS系统开发-窗口层级相关DisplayArea,WindowContainer

    官方注释: 给可以直接持有窗口的自己或它的孩子定义了一些公共的方法和属性,像RootWindowContainer、DisplayContent、DisplayArea、DisplayArea.Tokens、TaskDisplayArea、Task、ActivityRecord、WindowToken、WindowState都是直接或间接的继承该类。 这里面主要的重要要成员变量就是mParent和mChildren,一

    2024年02月16日
    浏览(37)
  • Android 系统级APP 升级方案 OTA全流程

    支持原创,请关注专栏: 高质量文章导航 一.Android ota固件编译 OTA 介绍 OTA ( over the air )升级是 Android 系统提供的标准软件升级方式。它功能强大,提供了 完全升级(完整包)、增量升级模式(差异包),可以通过本地升级,也可以通过网络升级 1.完整包 完整包所包含内容

    2024年02月02日
    浏览(80)
  • Android 12.0 系统开机自启动第三方app

      在12.0的系统rom定制化开发中,由于有些第三方app,需要在接收到开机广播后,启动app,但是在10.0以后第三方app就接收不到开机广播了 只有系统app才可以接收到开机广播了,所以在app内通过接收开机广播自启动就没法实现了 这就需要在系统中添加监听开机完成广播的功能,然

    2024年02月10日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包