深入理解Android Activity的四种LaunchMode

2024-09-04 11:12

本文主要是介绍深入理解Android Activity的四种LaunchMode,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在Android开发中,Activity的启动模式(LaunchMode)是控制Activity实例创建、复用及在任务(Task)中排列方式的重要机制。理解并掌握这些模式对于构建高效、流畅的用户体验至关重要。本文将详细探讨standardsingleTopsingleTasksingleInstance这四种启动模式,并通过实例和图示来加深理解。

1. standard(标准模式)

默认行为

  • 默认情况下,如果未指定<activity>android:launchMode属性,则使用standard模式。
  • 每次通过startActivity()方法启动Activity时,系统都会创建一个新的Activity实例,并将其放置在调用它的Activity所在的任务(Task)的栈顶。

实例演示
        假设我们有一个FirstActivity,并在其内部有一个按钮,点击该按钮会再次启动FirstActivity。在standard模式下,每次点击按钮都会创建一个新的FirstActivity实例,并将它们依次压入任务栈中。因此,需要连续按多次后退键才能回到最初的FirstActivity实例。

图示说明

Task Stack:  - FirstActivity (Instance 1)  - FirstActivity (Instance 2) <- 新实例  - FirstActivity (Instance 3) <- 再次新实例
2. singleTop(栈顶复用模式)

行为特点

  • 如果新的Activity已经位于任务栈的顶部,则系统不会创建新的Activity实例,而是复用栈顶的Activity实例,并调用其onNewIntent()方法(如果已覆盖)。
  • 如果新的Activity不位于栈顶,则系统仍然会创建新的Activity实例。

实例演示
        考虑FirstActivitySecondActivity的跳转关系。在FirstActivity中启动SecondActivity,然后在SecondActivity中再启动FirstActivity。由于FirstActivity此时不在栈顶,所以系统会创建一个新的FirstActivity实例。但如果从FirstActivity(此时它在栈顶)启动自己,则不会创建新实例。

图示说明

Task Stack:  - FirstActivity (Instance 1)  - SecondActivity (Instance 1)  - FirstActivity (Instance 2) <- 新实例,因为FirstActivity不在栈顶

如果FirstActivity已经在栈顶:

Task Stack:  - FirstActivity (Instance 1) <- 复用此实例
3. singleTask(栈内复用模式)

行为特点

  • 系统会寻找已存在的、与请求匹配的Activity实例。如果找到,则将该Activity之上的所有Activity实例出栈,并将找到的实例置于栈顶。
  • 如果未找到匹配的实例,则创建新的Activity实例。
  • 该模式通常用于实现应用的单一入口点或需要清理栈中旧实例的场景。

实例演示
FirstActivity中启动SecondActivity,然后在SecondActivity中启动FirstActivity(设置FirstActivitylaunchModesingleTask)。此时,SecondActivity会被出栈,FirstActivity实例成为栈顶对象。

图示说明

初始栈:  - FirstActivity (Instance 1)  - SecondActivity (Instance 1)  跳转后栈:  - FirstActivity (Instance 1) <- SecondActivity被出栈
4. singleInstance(单实例模式)

行为特点

  • 创建一个新的任务,并在该新任务的底部放置新的Activity实例。
  • 由于该Activity实例位于单独的任务中,因此它永远是该任务的唯一成员。
  • 其他应用可以通过该Activity的Intent Filter来启动它,但每次启动都会重新定位到该Activity实例(即,如果它已经在某个任务中,则系统会将该任务置于前台)。

实例演示
假设FirstActivitystandard模式,SecondActivitysingleInstance模式。从FirstActivity启动SecondActivity时,系统会为SecondActivity创建一个新的任务,并将其置于该任务的底部。之后,无论SecondActivity如何跳转,它都保持在这个独立的任务中。

图示说明

Task 1 (包含FirstActivity):  - FirstActivity (Instance 1)  Task 2 (为SecondActivity新创建):  - SecondActivity (Instance 1)

    从SecondActivity启动FirstActivity时,FirstActivity会创建在Task 1中,而不是Task 2中。

高级应用场景

  • ShareActivity:假设有一个Share应用,其中的ShareActivity用于处理来自其他应用的共享请求。将ShareActivity设置为singleInstance模式可以确保它在整个系统中只有一个实例,并且其他应用可以安全地调用它,而不必担心实例冲突或状态不一致的问题。
总结

        理解Activity的四种启动模式对于开发Android应用至关重要。每种模式都有其特定的应用场景和优缺点,合理选择可以显著提高应用的性能和用户体验。通过本文的详细讲解和实例演示,希望读者能够更深入地掌握这些模式,并在实际开发中灵活运用。

这篇关于深入理解Android Activity的四种LaunchMode的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135864

相关文章

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Python实现阶乘的四种写法

《Python实现阶乘的四种写法》本文主要介绍了Python实现阶乘的六种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录第一种:推导式+循环遍历列表内每个元素相乘第二种:调用functools模块reduce的php累计

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。