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

news2024/11/15 19:42:19

文章目录

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

生命周期

返回栈

每个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. onDestory

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

  1. onStart

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

  1. onStop

Activity 不再可见时调用

  1. onResume

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

  1. onPause

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

  1. onRestart

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

启动模式

standard模式

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

配置方式

配置启动模式方式:

  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 配置


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


参考:

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

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

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

相关文章

scratch笔记

一、图章 练习题&#xff1a; 【画笔】 一、选择题 1.怎样修改图章的颜色&#xff1f;&#xff08;D &#xff09; A. 只需要一个数字来设置颜色 B. 设置RGB的值 C. 在画笔中设置颜色、饱和度、亮度 D. 在外观中设置或修改角色颜色特效 2.执行下面程序&#xff0c;最后可能出…

idea中如何创建yml、yaml、properties配置文件

目录 1、配置文件 2、创建yml配置文件 3、配置文件的优先级 1、配置文件 我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件…

视频加密软件哪个好?怎么进行视频文件加密?

员工A&#xff1a;“最近公司有很多重要视频资料需要保存和分享&#xff0c;但担心安全问题&#xff0c;你有什么好推荐吗&#xff1f;” 员工B&#xff1a;“当然有&#xff0c;市面上有很多视频加密软件&#xff0c;其中我觉得域智盾非常不错。它是一款功能强大的企业文件加…

【Beyond Compare】Beyond Compare下载、安装与使用详细教程

目录 &#x1f33a;1 概述 &#x1f384;2 Beyond Compare 安装包下载 &#x1f33c;3 安装详细教程 &#x1f342;4 免费注册 &#x1f30d;5 使用详情 &#x1f33a;1 概述 Beyond Compare 是一款强大的文件和文件夹比较工具&#xff0c;广泛应用于软件开发、文档管理和…

【基础算法总结】优先级队列

优先级队列 1.最后一块石头的重量2.数据流中的第 K 大元素4.前K个高频单词4.数据流的中位数 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1…

Unity UGUI 之 Mask

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是遮罩 遮罩是一…

docker搭建python3的私有源--devpi

一、部署 # docker run -d --name devpi-lib -p 7104:7104 --env DEVPISERVER_HOST0.0.0.0 --env DEVPISERVER_PORT7104 --env DEVPISERVER_ROOT_PASSWORDpassword --env DEVPISERVER_USERlowinli --env DEVPISERVER_PASSWORDpassword --env DEVPISERVER_MIRROR_INDEXpypi --…

赋能未来教育,3DCAT助力深圳鹏程技师学院打造5G+XR实训室

随着国家对教育行业的重视&#xff0c;实训室建设已成为推动教育现代化的关键。《教育信息化2.0行动计划》、《职业教育示范性虚拟仿真实训基地建设指南》等政策文件&#xff0c;明确指出了加强虚拟仿真实训教学环境建设的重要性。 在这一大背景下&#xff0c;教育行业对于实训…

Open3D 计算点云的占地面积

目录 一、概述 1.1实现步骤 1.2应用 二、代码实现 1.1关键函数 1.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 前期试读&#xff0c;后续会将博客加入下列链接的专栏&#xff0c;欢迎订阅 Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、概述 该博客在…

AI漫画定格新闻大事件,比电影还燃!吸粉超快!AI绘画变现新方法你还不知道吗?!

大家好&#xff0c;我是画画的小强 身处这个信息如潮水般涌来的时代&#xff0c;我们仿佛被连绵不绝的新闻浪潮所淹没。然而&#xff0c;真正能触动我们内心深处&#xff0c;让我们产生强烈共鸣的&#xff0c;往往是那些饱含情感、直击心灵的新闻画面。 在追求效率与速度的今…

草图也能秒变完整画稿?三星 Galaxy Z Fold6 、Flip6硬件升级

在科技的不断进步中&#xff0c;智能手机行业的竞争愈发激烈&#xff0c;各大厂商纷纷推出创新产品以吸引消费者。 最近&#xff0c;三星在 Galaxy Unpacked 发布会上就带来了 Galaxy Z Fold6 和 Flip6 两款手机新品&#xff0c;这两款设备不仅在硬件上有所突破&#xff0c;更…

SpringBoot中使用监听器

1.定义一个事件 /*** 定义事件* author hrui* date 2024/7/25 12:46*/ public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() …

MES系统具体有哪些功能?如何更高效的利用MES系统

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;是现代制造业中非常重要的一个信息化管理系统&#xff0c;它在生产过程中起到了关键的作用。MES系统的具体功能可以归纳如下&#xff1a; 万界星空科技MES系统的具体功能 生产计划管理…

基于MediaPipe的手部特征点识别

基于MediaPipe的手部特征点识别 MediaPipe简介 MediaPipe Solutions 提供了一套库和工具&#xff0c;可以在安卓或者windows应用中快速应用人工智能 (AI) 和机器学习 (ML) 技术。 MediaPipe 手部地标任务可检测图片中手部的特征点。识别效果如下 环境配置 python -m pip ins…

【数据结构】手把手教你单链表(c语言)(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 1.单链表的概念与结构 2.单链表的结构定义 3.单链表的实现 3.1 单链表的方法声明 3.2 单链表方法实现 3.2.1 打印链表 3.2.2 创建新…

一文详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储

在高性能计算场景中&#xff0c;往往采用全闪存架构和内核态并行文件系统&#xff0c;以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加&#xff0c;全闪存的高成本和内核客户端的运维复杂性成为主要挑战。 JuiceFS&#xff0c;是一款全用户态的云原生分布式文件…

[240726] Mistral AI 发布新一代旗舰模型 | Node.js 合并 TypeScript 文件执行提案

目录 Mistral AI 发布新一代旗舰模型&#xff1a;Mistral Large 2Node.js 合并 TypeScript 文件执行提案&#xff1a;--experimental-strip-types Mistral AI 发布新一代旗舰模型&#xff1a;Mistral Large 2 Mistral AI 宣布推出新一代旗舰模型 Mistral Large 2&#xff0c;该…

ubuntu20.04 安装vscode 并且配置环境

目录 1.下载 2.安装 3.装插件&#xff0c;配置环境 1.下载 打开浏览器&#xff0c;进入vscode主页 Visual Studio Code - Code Editing. Redefined 2.安装 双击安装包 安装 安装完成后&#xff0c;我们打开vscode 3.装插件&#xff0c;配置环境 打开后我们 ctrlj 打开终…

操作系统的底层管理

一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本和我们不常见的计算机&#xff0c;如服务器大多都遵循冯诺依曼体系结构。 根据冯诺依曼结构 &#xff0c;我们可以了解到计算机是由一个个硬件组成&#xff0c;共分为三部分&#xff1a;输入、内存/CPU和输出。 如果…

【odoo17 | Owl】前端js钩子调用列表选择视图

概要 在我们选择多对一或者多对多字段的时候&#xff0c;经常看到可以弹出列表弹窗让人一目了然的效果&#xff0c;效果如下&#xff1a; 那么&#xff0c;这种效果是odoo本身封装好的组件&#xff0c;我们在平时的前端界面开发的时候&#xff0c;既不是后端视图的情况下&#…