【Android】Activity生命周期与五种启动模式

news2024/11/14 17:48:42

文章目录

  • 生命周期
    • 返回栈
    • Activity状态
    • 生命周期方法
  • 启动模式
    • standard模式
    • singleTask模式
    • singleTop模式
    • singleInstance模式
    • singleInstancePerTask模式
    • 配置方式

生命周期

返回栈

每个Activity的状态由它在Activity栈(又叫“回退栈back stack”)中的位置决定,是所有当前正在运行的Activity的后进先出集合。

当一个新的Activity启动时,它会变为活动状态并被压入栈顶。

如果用户使用Back按钮进行回退,或者前台Activiy以其他方式关闭了,那么栈中的下一个Activity就会并外于活动状态。

image-20240725093102099

Activity状态

  1. 活动状态
    当 Activity 位于栈顶时,它对于用户输入而言是一个可见且拥有焦点的前台 Activity。Android会不惜一切代价让它存活下来,甚至会根据需要杀死栈中更底部的 Activity 所依附的应用,以保障该Activity 所需的资源。当另一个 Activity 变为活动状态时,这个 Activity 就会被暂停,当变为不可见时,它就会被停止。

  2. 暂停状态

    在某些情况下,Activity虽然可见,但它并没有获得焦点。这时,它就处于暂停状态。当应用在多窗口环境中使用时,也可能会达到这种状态。在此环境中,可能会出现多个应用同时可见,但只有用户最后一次与之交互Activity 才会被认为处于活动状态。

    当暂停时,Activity 还被视为是活动的,但它不能再接收到用户的各种输入事件。甚至在极端的情况下Android还会杀死暂停状态下的 Activity来恢复处于活动状态的 Activity 所需要的资源。当一个 Activity 变得完全不可见时,它就会处于停止状态,而所有 Activity 在进入停止状态之前都要经历暂停状态以进行转换。

  3. 停止状态
    当一个Activity不可见时,它就进入了停止状态。此时Activity 将保存在内存中,并保留所有的获态信息;然而,当系统需要内存时,它也就成可能被终止的候选者。

  4. 不活动状态

    一个 Activity 在被杀死之后到被启动之前,都处于不活动状态。不活动状态的Activity 已经从栈中移除,需要重新启动才能再次显示和使用它们。

生命周期方法

IMG_20240725_092516

三种生存期,七个回调方法

  1. onCreate

Activity第一次被创建时调用,整个Activity生命周期只会调用一次。

初始化Activity并填充UI布局

  1. onStart

Activity 即将变得可见时调用,但不能交互

  1. onResume

Activity 将开始与用户进行交互时调用。

  1. onPause

系统准备开始另一个 Activity 时调用。此时 Activity 仍然可见,但失去焦点。

  1. onStop

Activity 不再可见时调用

  1. onDestory

Activity 被销毁前调用。可能由系统或用户主动销毁 Activity

  1. onRestart

Activity 从停止状态重新启动前调用。

示例:

第一次启动应用程序:oncreate()->onStart()->onResume()->

切到后台:onPause()->onStop()->

再次打开:onRestart()->onStart()->onResume()->

切到后台并删除:onPause()->onStop()->onDestory()

启动模式

standard模式

默认模式:标准模式是默认的启动模式,如果你在 AndroidManifest.xml 中没有指定启动模式,那么默认使用标准模式。

每次启动新实例:每次启动 Activity 时,系统都会创建该 Activity 的新实例,并将其放在任务堆栈的顶部。

无重用机制:如果一个 Activity 已经存在,并且你再次启动它,系统不会重用已经存在的实例,而是会创建一个新的实例。
image-20240725100208824

singleTask模式

当跳到一个SingleTask模式的Activity时:

  1. 判断当前任务栈内是否已经有该Activity

  2. 如果没有,则新建一个,并正常入栈

  3. 如果已经有了,则把该Activity上面的全部弹出,将该Activity暴露在最上面

image-20240725100245068

singleTop模式

栈顶复用

当跳到一个SingleTop模式的Actigity时:

判断当前任务栈的栈顶是否是该Activity

  1. 如果栈顶不是,则新建一个,并正常入栈
  2. 如果栈顶是,直接复用栈顶的Activity,不新建Activity

在这里插入图片描述

singleInstance模式

当跳到一个singleInstance模式的Activity时:

  1. 如果发现某任务栈已经有该Activity时,直接复用,不新建

  2. 如果还没有,则直接新开辟一个栈,新建该Activity入栈。专门盛放该Activity

    独享一个任务栈

image-20240725101704340

image-20240725101735944

singleInstancePerTask模式

  • singleInstancePerTask 可以看作是 singleTask 的一个变种。

  • 它允许同一个 Activity 在多个任务(Task)中有多个实例,但每个实例都位于其所在任务的根位置。

  • 结合 Intent.FLAG_ACTIVITY_MULTIPLE_TASKIntent.FLAG_ACTIVITY_NEW_DOCUMENT,每次启动这个 Activity 都会创建一个新的任务,并将该 Activity 作为任务的根 Activity。

  • 当你需要同一个 Activity 在多个任务中存在多个独立的实例时,可以使用 singleInstancePerTask。每次启动该 Activity 都会创建一个新的任务,这些任务彼此独立,互不影响

配置方式

配置启动模式方式:

  1. AndroidManifest.xml 文件中配置

不写默认standard模式

<activity android:name=".MainActivity"
    android:launchMode="singleInstance">
</activity>
<activity android:name=".MainActivity"
    android:launchMode="singleTop">
</activity>
<activity android:name=".MainActivity"
    android:launchMode="singleTask">
</activity>
  1. 通过 Intent 设置

所有启动activityBintent都需要设置,只对从activityA跳转到activityB这次生效

  • singleTask
        // 为ActivityA设置singleTask启动模式
        Intent intent = new Intent(this, ActivityA.class);
        
        // 添加FLAG_ACTIVITY_CLEAR_TOP标志
        // 这个标志的作用是,如果ActivityA已经在任务栈中存在,那么将栈中位于ActivityA之上的所有Activity全部出栈,使ActivityA成为栈顶Activity
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        
        // 添加FLAG_ACTIVITY_NEW_TASK标志
        // 这个标志表示将会为这个Intent启动一个新的任务栈。如果这个Intent的targetActivity属于一个已经存在的任务栈
        // 那么将会把这个targetActivity及其所有子Activity全部移动到一个新的任务栈中
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
  • singleTop
        Intent intent = new Intent(this, ActivityA.class);
        // 添加FLAG_ACTIVITY_SINGLE_TOP标志
        // 当这个标志被设置后,如果ActivityA已经在任务栈的顶部,那么不会创建新的实例
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
  • SingleInstance没有对应的Flag

总结:

启动模式描述Intent 标志位配置方式
standard每次启动都会创建新实例。AndroidManifest.xml
singleTop栈顶复用Intent.FLAG_ACTIVITY_SINGLE_TOPAndroidManifest.xmlIntent
singleTask栈中复用Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TOP
AndroidManifest.xmlIntent
singleInstance独立任务栈AndroidManifest.xml 配置
singleInstancePerTask每个任务的根 Activity,支持多个实例Intent.FLAG_ACTIVITY_MULTIPLE_TASK Intent.FLAG_ACTIVITY_NEW_DOCUMENTAndroidManifest.xml 配置


感谢您的阅读
如有错误烦请指正


参考:

  1. 18-认识Activity的启动模式_哔哩哔哩_bilibili
  2. 【Android】Activity的启动模式_在代码中指定启动另外一个activity的启动模式-CSDN博客
  3. 《Android 高级编程(第4版)》
  4. 《第一行代码》

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

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

相关文章

Web Worker 详细介绍

Web Worker 详细介绍 如果我们有一些处理密集型的任务&#xff0c;但是不想让它们在主线程上运行&#xff08;那样会使浏览器/UI变慢&#xff09;&#xff0c;这时候我们可能会希望 JavaScript 可以以多线程的方式操作。 虽然 JavaScript 是单线程了&#xff0c;但是在浏览器…

超声波眼镜清洗机哪款好用又实惠?4款高评分眼镜清洗机机型深度测评

眼镜党都知道超声波清洗机吧&#xff0c;每次眼镜脏了&#xff0c;去眼镜店清洗&#xff0c;店员用的就是超声波清洗机。利用超声波的原理&#xff0c;这种清洗机可以深入物品内部进行清洁&#xff0c;效果非常出色。相比手工清洗&#xff0c;超声波清洗机能在清洁过程中保护镜…

远程项目调试-informer2020

informer2020 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting(原文&#xff09;Informer 是一个基于Transformer的模型&#xff0c;是为了应对长依赖关系而开发的。本文的主要主题是序列预测。序列预测可以在任何具有不断变化的数据的地方…

做短视频素材哪里找?去哪里下载?自媒体下载素材网站分享

自媒体视频创作&#xff1a;高质量素材网站大公开&#xff01; 大家好&#xff0c;我是一名热情的短视频创作者。今天&#xff0c;我要与大家分享一些寻找优质视频素材的秘诀。无论是新手还是老手&#xff0c;这些建议都能帮助你的视频在众多平台中脱颖而出&#xff0c;吸引更…

系统移植(四)u-boot移植 ② basic版本

文章目录 一、u-boot移植&#xff08;一&#xff09;生成u-boot源码1. 配置交叉编译器&#xff0c;修改u-boot源码目录下的MAKEFILE文件4. 执行make <board_name>_defconfig命令&#xff0c;配置u-boot源码5. make menuconfig---图形化界面配置6. 根据DK1板子的设备树文件…

ISP 代理提供商:互联网安全的关键参与者

简介&#xff1a;互联网安全的演变态势 互联网改变了我们互动、工作和开展业务的方式&#xff0c;但也带来了与安全性和可访问性相关的重大挑战。在这个数字时代&#xff0c;互联网服务提供商 (ISP) 代理提供商在解决这些问题方面发挥着关键作用。他们提供的基本服务不仅可以增…

PDF解锁网站

https://smallpdf.com/cn/unlock-pdfhttps://smallpdf.com/cn/unlock-pdfhttps://www.freemypdf.comhttps://www.freemypdf.com

LVGL使用上一个不方便的问题记录

slider这个控件&#xff0c;应该画在蓝色框的里面&#xff0c;源码实现将中心画在蓝色框上&#xff0c;导致总会有两边超出的情况出现&#xff0c;真想修改源码&#xff0c;作者不知道咋想的&#xff1f;&#xff1f;&#xff1f;

vue3 Router 点击index中的按钮,查看相应的详情信息,并且传递id,及其路由的定义方法。

1、路由的定义 结构如下: 2、路由定义代码&#xff1a; {path: tabs,name: TabsDemo,component: () > import(/views/demo/feat/tabs/index.vue),meta: {title: t(routes.demo.feat.tabs),hideChildrenInMenu: true,},children: [{path: detail/:id,name: TabDetail,compon…

封装和桥接Unity 协程体系

简介 协程&#xff08;Coroutine&#xff09;在C#中是一种特殊的函数&#xff0c;它允许开发者编写可以暂停执行并在未来某个时刻恢复执行的代码块。协程通常用于实现异步操作&#xff0c;如延时执行、等待某个事件发生、或者分段执行复杂的任务。在Unity游戏引擎中&#xff0c…

Cuda编程模型中常见的错误检测方法

Cuda编程模型中常见的错误检测方法 1 CUDA错误检测简介2 直接嵌入检测函数2.1 检测函数介绍2.2 使用示例 3 封装在.cuh头文件中嵌入3.1 创建 error.cuh 头文件3.2 在 CUDA 程序中包含 error.cuh 并调用 CHECK 宏3.3 使用示例 1 CUDA错误检测简介 CUDA编程模型中的错误检测是确…

【C++】选择结构案例-三只小猪称体重

案例问题 假设有三只小猪A、B、C&#xff0c;在输入三者体重后希望能输出他们各自的体重并测出谁最重 思路 先让A与B相比较&#xff0c;如果A重&#xff0c;则让A和C相比较&#xff0c;如果A重则输出A最重&#xff0c;否则输出C最重 在最开始的条件&#xff08;AB相比较&am…

JQuery简单实现ul li点击菜单项被选中的菜单项保持高亮状态(导航ul li点击切换样式)

效果&#xff1a; JS&#xff1a; $(function () {//遍历list&#xff08;一般为ul li&#xff09;$("#menu a").each(function () {//给当前项添加点击事件&#xff08;点击后切换样式&#xff09;$(this).bind(click,function () {// 移除其他所有项的active类$(&…

Sokit(TCP/UDP调试工具)

下载&#xff1a;http://www.winwin7.com/soft/56522.html#xiazai Sokit中文版是一款免费开源的TCP / UDP 测试&#xff08;调试&#xff09;工具&#xff0c;它主要可以用于接收和发送TCP/UDP数据包&#xff0c;让你更深的了解网络状况&#xff0c;能够有效地接收、发送、转…

Linux中的进程1

进程的概念 程序&#xff1a;二进制文件 进程&#xff1a;启动的程序 所有的数据都在内存中 需要占据更多的系统资源 cpu&#xff0c;物理内存&#xff08;RAM&#xff09; 并行和并发 并发&#xff1a;在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动…

干货讲解 | 在线教育行业如何搭建帮助中心

引言 随着互联网技术的飞速发展&#xff0c;在线教育已成为教育领域不可或缺的一部分&#xff0c;它打破了传统教育的时空限制&#xff0c;让知识传播更加高效、便捷。然而&#xff0c;在享受在线教育带来的便利时&#xff0c;用户也面临着操作复杂、功能理解不透彻、遇到问题…

Java语言程序设计——篇七(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 封装性与多态 封装性与访问修饰符类的访问权限类成员的访问权限 &#x1f320;防止类扩展和方法覆盖实战演练 抽象类实战演练 对象转换实战演练…

github的Codespaces是什么

目录 github的Codespaces是什么 一、定义与功能 二、特点与优势 三、工作原理 四、使用场景与限制 github的Codespaces是什么 GitHub的Codespaces是一个基于云的即时开发环境,它利用容器技术为开发者提供一个完全配置好的开发环境,以便他们能够直接在浏览器或通过Visua…

《中国数据库前世今生》观影——认识1980年起步阶段

引出 中国数据库的前世今生观影——认识1980年的起步阶段 20 世纪 60 年代国外就有了商业数据库&#xff0c;20 世纪 80 年代我国才有了第一批数据库专业人才。不要小看这 20 年的差距&#xff0c;它可能需要几代数据库人用一生去追。2024 年了&#xff0c;中国跨过数据库这座大…

【Android】Fragment的数据传递

碎片和活动之间的通信 Activity向Fragment 通过方法传递 构造方法 将碎片动态地加载到活动当中&#xff0c;先得到一个碎片&#xff0c;再将其放到活动当中。就想到碎片的替代方法&#xff0c;将我们所要传输的数据直接放到新创建的碎片里面&#xff0c;替换到原来的碎片。…