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

文章目录

  • 生命周期
    • 返回栈
    • 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成为栈顶Activityintent.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.mzph.cn/news/875985.shtml

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

相关文章

MySQL高性能读写分离实战

介绍 我的上一篇文章实现了mysql的主从复制结构&#xff0c;今天这篇继续将如何实现读写分离。 读写分离是指&#xff1a;针对数据库的写操作&#xff08;插入、更新、删除等&#xff09;访问主数据库&#xff0c;读操作访问从数据库。 因为一般网站的读请求的数量是远远大于…

《数据结构:顺序实现二叉树》

文章目录 一、树1、树的结构与概念2、树相关术语 二、二叉树1、概念与结构2、满二叉树3、完全二叉树 三、顺序二叉树存储结构四、实现顺序结构二叉树1、堆的概念与结构2、堆的实现3、堆的排序 一、树 1、树的结构与概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff…

【Python机器学习】决策树的构造——划分数据集

分类算法除了需要测量信息熵&#xff0c;还需要划分数据集&#xff0c;度量划分数据集的熵&#xff0c;以便判断当前是否正确划分了数据集。 我们将对每个特征划分数据集的结果计算一次信息熵&#xff0c;然后判断按照哪个特征划分数据集是最好的划分方式。 想象一个分部在二…

4-4 数值稳定性 + 模型初始化和激活函数

数值稳定性 这里的 t t t表示层&#xff0c;假设 h t − 1 h^{t-1} ht−1是第 t − 1 t-1 t−1层隐藏层的输出&#xff0c;经过一个 f t f_{t} ft​得到第 t t t层隐藏层的输出 h t h^{t} ht。 y y y表示 x x x进来&#xff0c;第一层一直到第 d d d层&#xff0c;最后到一个损…

研究生选择学习Android开发的利与弊?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;产品经理可以学学Axure快…

vscode远程免密登入

1、windows (1) 点击左下角 ->将当前窗口连接到主机…->&#xff08;配置ssh文件&#xff0c;点击或者指定&#xff09;->按这个格式添加 (2) 在cmd命令窗口&#xff1a;ssh-keygen -t rsa (-C “name”) #这个name是远程linux的用户名&#xff0c;这里也可以不加-C…

H264编码器实现-帧内预测之像素值预测

前言 本文所介绍的像素值预测&#xff0c;是指在帧内预测总体流程中的预测块每个像素值的推导过程。当我们已知向量像素的重建值的时候&#xff0c;我们就可以对当前预测块进行像素值预测。该过程得到的结果将与源像素值相减得到残差&#xff0c;为后续变换量化提供数据来源。…

Godot入门 04平台设计

新建创景&#xff0c;添加AnimatableBody2D节点。 添加Sprite2D节点 拖动图片 剪裁图片&#xff0c;吸附模式&#xff1a;像素吸附 添加CollisionShape2D&#xff0c;设置实际形状为矩形 重命名AnimatableBody2D节点为Platform&#xff0c;保存场景&#xff0c;拖动platform场景…

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

深入理解 Java 虚拟机第三版(周志明)

这次社招选的这本作为 JVM 资料查阅&#xff0c;记录一些重点 1. 虚拟机历史 Sun Classic VM &#xff1a;已退休 HotSpot VM&#xff1a;主流虚拟机&#xff0c;热点代码探测技术 Mobile / Embedded VM &#xff1a;移动端、嵌入式使用的虚拟机 2.2 运行时数据区域 程序计…

软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能…

“消费增值风暴:百万业绩背后的创新电商模式“

今日&#xff0c;我怀着无比激动的心情&#xff0c;向您揭示一个激励人心的成长篇章。我们的战略伙伴在短短一个月内&#xff0c;业绩如火箭般攀升&#xff0c;成功跨越百万销售额大关&#xff0c;同时&#xff0c;其用户活跃度居高不下&#xff0c;日均在线用户数稳稳占据8至1…

[Unity] ShaderGraph实现镜头加速线/残血效果 URP

效果如下所示&#xff1a;残血状态时&#xff0c;画面会压暗角&#xff0c;并出现速度线营造紧迫感。 使用到的素材如下&#xff0c;换别的当然也可以。[这是张白色的png放射图&#xff0c;并非皇帝的新图hhh] 这个效果的实现逻辑&#xff0c;其实就是利用time向圆心做透明度的…

HAL库源码移植与使用之低功耗模式

低功耗特性对用电池供电的产品&#xff1a; 更小电池体积&#xff08;降低了大小和成本&#xff09; 延长电池寿命 电磁干扰更小&#xff0c;提高无线通信质量 电源设计更简单&#xff0c;无需过多考虑散热问题 电源供电区分为&#xff1a; 分为VDD供电区…

友思特应用 | 硅片上的光影贴合:UV-LED曝光系统在晶圆边缘曝光中的高效应用

导读 晶圆边缘曝光是帮助减少晶圆涂布过程中多余的光刻胶对电子器件影响的重要步骤。友思特 ALE/1 和 ALE/3 UV-LED 高性能点光源&#xff0c;作为唯一可用于宽带晶圆边缘曝光的 i、h 和 g 线的 LED 解决方案&#xff0c;可高效实现WEE系统设计和曝光需求。 晶圆边缘曝光及处…

分布式相关理论详解

目录 1.绪论 2.什么是分布式系统&#xff0c;和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…

通过ATS软件抓取ios手机日志方法记录

1.ios手机下载描述符文件&#xff0c;用于过检测 下载网址&#xff1a;https://developer.apple.com/bug-reporting/profiles-and-logs/?nameB 点击这个下载&#xff0c;之后在手机通用-VPN与设备管理里面找到刚才下载的描述文件然后安装&#xff1b; 2024.6月后注意会提示描…

springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step

springcloud RocketMQ &#xff0c;一个mq消息发送后&#xff0c;客户端是怎么一步步拿到消息去消费的&#xff1f;我们要从代码层面探究这个问题。 找的流程图&#xff0c;有待考究。 以下我们开始debug&#xff1a; 拉取数据的线程&#xff1a; PullMessageService.java 本…

Linux构建远程YUM仓库与NFS共享存储服务

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

YOLOX+PyQt5交通路口智能监测平台设计与实现

1.概述 交通要道的路口上人车穿行&#xff0c;特别是上下班早高峰&#xff0c;且时常发生交通事故。因此对交通路口的车流量和人流量的监测必不可少。 2.检测模型 使用的检测模型为YOLOX模型&#xff0c;模型权重为训练VOC数据集得来&#xff0c;其中包括了二十个类别&#…