Android基础之Activity篇-启动模式探索(Cover Android Develop Guide)

以前看过一两篇启动模式的文章,工作中多少有接触启动模式,对启动模式的半懂不懂也给自己带来了不少的阻碍。

在阅览了谷歌安卓开发者文档中对启动模式相关的阐述后,觉得很不错,有必要记录下,所以归纳了文档中有关启动模式的讲解。

----link start----

个人注:任务(task)和回退栈(back stack)是两个不同的概念,但两者实际是一一对应的,有关启动模式模糊的说法里,任务和回退栈两个词可以互相替换。

 一 关于四种launch-mode的简要对比和介绍

下图是官网中的对比,可以说很简洁明了了。

总结(四种模式从上到下分别用A,B,C,D表示):

1.A和B较常用,C和D是不常用的。因为“大多数应用因为它们所形成的交互模式可能让用户感到陌生”

2.A和B是多实例的,他们可以分布在任何不同的任务中,也可以分布在一个任务里的多个位置。

3.在一个设备中,C和D启动的Activity是单实例的。也就是说如果通过这两种方式启动Activity,启动的Activity不存在自不必说,而如果已存在,将调用它的onNewIntent()而不创建新的实例。他们的不同点仅在于被启动的Activity在它所属回退栈中是否是唯一实例。

4.B模式仅在满足“目标栈顶部已有当前欲启动的实例时”,才不创建新的实例。

5.除standard外其余模式均可能调用到onNewIntent(),另外如果在intent中附加FLAG_ACTIVITY_CLEAR_TOP,也有可能调用onNewIntent()。加粗的可能触发的条件都是相同的:对应启动的实例在当前进程中已存在。

6.很重要的一点。C和D启动的Activity均始终位于回退栈的根部。

上面四种模式均可以在清单文件中<activity>标签中指定。standard为默认。

除此之外,在代码中可以通过Intent类实例附加一些flag,可以达到部分类似的功能,分别是:

FLAG_ACTIVITY_NEW_TASK 同singleTask

FLAG_ACTIVITY_SINGLE_TOP 同singleTop

FLAG_ACTIVITY_CLEAR_TOP 

没有相对应的launchMode值,它的意思是如果当前task中已有要启动的实例,则不会创建新实例,用当前实例取而代之,同时,之前在其之上的其他实例则会被弹出。这个flag通常可以与FLAG_ACTIVITY_NEW_TASK 一同使用。意义与FLAG_ACTIVITY_CLEAR_TOP 单独使用的不同在于,它将clear_top只能在当前task中生效变成在其他tasks中生效,注意是其他,所以不包括自己了。

这里贴上原文:

FLAG_ACTIVITY_CLEAR_TOP is most often used in conjunction with FLAG_ACTIVITY_NEW_TASK. When used together, these flags are a way of locating an existing activity in another task and putting it in a position where it can respond to the intent.

额外的知识

android系统在activity之间的跳转有一种系统的方式,叫“向上导航(up Navigation)”,可以通过AndroidManifest指定一个activity的父级activity,然后通过NavUtil这个类去跳转。具体的介绍可以看这里 Providing Up Navigation

如果你向上导航到父级页面,根据父级activity的不同启动模式,父级页面有不同的表现:

  • If the parent activity has launch mode <singleTop>, or the up intent contains FLAG_ACTIVITY_CLEAR_TOP, the parent activity is brought to the top of the stack, and receives the intent through its onNewIntent() method.
  • 如果父activity有singleTop的启动模式,或者up intent包含了FLAG_ACTIVITY_CLEAR_TOP,则父activity在被带入栈顶的同时,会调用到onNewIntent(),
  • If the parent activity has launch mode <standard>, and the up intent does not containFLAG_ACTIVITY_CLEAR_TOP, the parent activity is popped off the stack, and a new instance of that activity is created on top of the stack to receive the intent.
  • 相反的,如果activity是standard模式,而且没有FLAG_ACTIVITY_CLEAR_TOP,则旧的activity会被弹出栈(其之上当然也会被弹出),然后创建一个新的实例。

二 任务和返回栈

 有关任务和返回栈的基础认识:android系统是多任务(multi-tasks)的。所以可以同时处理多个任务,任务分为前台任务(foreground task)和后台任务(background task)。后台任务可以存在多个,但因为资源有限,过多的任务会导致系统回收部分资源,不过,任务自身仍然保留,当然,任务能保留的个数也是有限的。

一个应用默认为一个任务,可以拥有多个任务(singleTask,singleInstance或者FLAG_ACTIVITY_NEW_TASK)

管理任务和返回有以下几种方式

----logout-------

(有错误和补充会随时更新)

参考链接:

概览屏幕

任务和返回栈(tasks-and-back-stack)

Android Reference之launch mode

Android Reference之FLAG_ACTIVITY_CLEAR_TOP等FLAG

原文地址:https://www.cnblogs.com/chitanta/p/9712431.html