关于singleTask (LaunchMode随笔)

今天,居然被问起关于singleTask的问题,问题如下:

“现在Activity栈里有4个Activity,从栈底到栈顶分别是A->B->C->D,现在从Activity D启动Activity B,问此时的栈情况。”

我居然忘了,只是记得有singleTask/singleTop/singleInstance,又还记得有一个是会把他上面的Activity全部Pop出,自己回到栈顶(殊不知这个现象就是问题的答案),从现象和字面上看来好像是singleTop。

回来之后怒查Google,并写了个小程序实践了下,增强印象,并决定写下Blog以便以后回顾。

现在我们先来复习下,singleTask和singleTop分别是什么样的行为。

> LaunchMode为singleTop

其实singleTop很简单,就是当且仅当Activity在栈顶的时候才会复用(意思就是栈顶绝不会有连续两个该Activity),当Activity不在栈顶的时候都会重新创建的。

同学们可能会纳闷,都在顶部那有什么卵用啊,栈顶不就代表着是手机显示的Activity吗?不是的,其实Android系统中有很多的Task栈的,同个栈里的Activity都是一个Task(Task是个复杂的概念,具体的概念请看官方文档,你可以简单理解为一个任务场景)。

比如:

TaskA:

(栈底)ActivityA1 -> ActivityA2 (singleTop)

TaskB:

(栈底)ActivityB1 -> ActivityB2(启动ActivityA2)

目前界面为ActivityB2,ActivityB2启动ActivityA2,那当前栈会切换到TaskA,连续按返回键的Activity顺序为:

ActivityA2 -> ActivityA1 -> ActivityB2 -> ActivityB1

看到区别了吧。

> LaunchMode为singleTask

只要Activity存在栈中,都会被复用,但是会直接把Activity推到栈顶(也就是会把Activity到栈顶的其他Activity全部出栈)。

比如:

TaskA:

(栈底)ActivityA1 -> ActivityA2 (singleTask)-> ActivityA3

TaskB:

(栈底)ActivityB1 -> ActivityB2(启动ActivityA2)

目前界面为ActivityB2,ActivityB2启动ActivityA2,那当前栈会切换到TaskA,连续按返回键的Activity顺序为:

ActivityA2 -> ActivityA1 -> ActivityB2 -> ActivityB1

ActivityA3不见了,A3在B2启动A2的时候就被出栈销毁了。

> LaunchMode为singleInstance

这个更简单,就是我只想一个人静静地。自己一个人独占一个栈,不会包含其他的Activity。

简单吧,这样LaunchMode就都讲明白了。

最后说下怎么启动一个新的Activity栈,难道非要建多个App(好麻烦啊)?

其实是不用的。

我们在AndroidManifest.xml中声明Activity的时候,有一个taskAffinity参数的(如果没有显示声明,则默认继承于Application,Application没声明则默认为AppId[包名])。

通过声明taskAffinity和Intent.FLAG_ACTIVITY_NEW_TASK可以把该Activity创建在新栈。

注:taskAffinity需要和包名一样的格式。

写在最后

没有图片比较简单,但我会继续加油优化的,先把写Blog的习惯养成。

时间: 2024-10-02 19:19:49

关于singleTask (LaunchMode随笔)的相关文章

android launchMode理解以及应用场景

在我们写应用的时候,常常涉及多个activity组件之间的跳转.比如说某个资讯的页面中,点击下一篇资讯跳转相同的页面,只有页面的数据不一样.一般情况下我不会注意launchMode 这个属性,只会使用默认的,这样会产生大量重复的activity.那是因为之前不了解,所以特此研究学习. 1.如何指定launchMode 基本上我们可以直接指定一个launchMode属性在AndroidManifest.xml 文件中 <activity android:name=".views.MainAc

深入讲解Android中Activity launchMode

Android系统中的Activity可以说一件很赞的设计,它在内存管理上良好的设计,使得多任务管理在Android系统中运行游刃有余.但是Activity绝非启动展示在屏幕而已,其启动方式也大有学问,本文讲具体介绍Activity的启动模式的诸多细节,纠正一些开发中可能错误的观点,帮助大家深入理解Activity. 行文之前 在正式行文之前,先介绍一些文章提到的概念 文章后续会提到Task,这里的Task指的是与用户交互的Activity实例的集合. Task中的Activity实例以栈的形式

启动标志 和launchMode

(1) FLAG_ACTIVITY_NEW_TASK: 操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B, 启动Activity B的Intent的Flag设为 FLAG_ACTIVITY_NEW_TASK, Activity B被压入Activity A所在堆栈(堆栈状态: AB).  原因: 默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity). b. 前提: Activity A在名称为

android launchMode加载模式和intent flag

ApplicationTask和Process的区别与联系 Application task process 四种加载模式 standard模式 singleTop模式 singleTask模式 singleInstance模式 SingleTask和SingleInstance区别 实例 startActivityForResult如果被启动activity加载模式为SingleTask和SingleInstance 使用Intent标志 FLAG_ACTIVITY_NEW_TASK FLAG

FLAG_ACTIVITY_NEW_TASK介绍

FLAG_ACTIVITY_NEW_TASKStart the activity in a new task. If a task is already running for the activity you are now starting, that task is brought to the foreground with its last state restored and the activity receives the new intent in onNewIntent().

Android Api Component---翻译任务和回退栈(Tasks and Back Stack)

一个应用程序通常包含多个activity.每一个activity应当围绕一个指定的用户可以执行的并且可以开启其它activity的动作种类被设计.例如,一个emali应用程序也许有一个activity展示新消息列表.当用户选择了一个消息的时候,一个新的activity会打开查看这个消息. 一个activity甚至可以开启设备上的其它应用程序的activity.例如,如果你的应用程序向发送一个邮件消息,你可以定义一个intent执行一个"send"动作并且包含一些像email地址和消息的

Android启动标记

1. Task是包含一系列Activity的堆栈, 遵循先进后出原则. 2. Task默认行为: (1) 前提: Activity A和Activity B在同一个应用中. 操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B(堆栈状态: AB), 按下BACK返回键(堆栈状态: A). (2) 前提: Activity A和Activity B在同一个应用中, 应用名称为"TaskOne应用". 操作: 在Launch

Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释

本文大部分参考自 http://blog.csdn.net/mayingcai1987/article/details/6200909 ,对原文中的讲解FLAG_NEW_TASK地方加了一些自己的观点,用红色标记 1. Task是包含一系列Activity的堆栈, 遵循先进后出原则. 2. Task默认行为: (1) 前提: Activity A和Activity B在同一个应用中. 操作: Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activit

android:configChanges=&quot;keyboard|keyboardHidden|orientation|screenSize&quot;

<activity android:name="xxxActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:launchMode="singleTask" ---launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时