Android activity栈、启动模式和intent flag属性详解

原创 2015年07月10日 16:53:18

一、Activity栈的概念
       1.每个app应用程序启动的activity都会保存在一个单独的栈里面。
       2.有可能某个activity发生栈转移。

二、acitivity的启动模式

1.standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

例如:
若我有一个Activity名为A1,上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
back键会依照栈顺序依次退出。

2.singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。

例如:
若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1standardB2singleTop
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2


3.singleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个ActivitysingleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

例如:
若我的应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2singleTask模式,那么,无论我在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。
但是C1->C2->C3->C2->C3->C1-C2,这样的操作过程实际应该是如下这样的,因为singleTask会把task中在其之上的其它Activity destory掉。
操作:C1->C2         C1->C2->C3         C1->C2->C3->C2           C1->C2->C3->C2->C3->C1            C1->C2->C3->C2->C3->C1-C2
实际:C1->C2         C1->C2->C3         C1->C2                             C1->C2->C3->C1                             C1->C2

若是别的应用程序打开C2,则会新启一个task
如别的应用Other中有一个activitytaskId200,从它打开C2,则C2taskIdI不会为200,例如C2taskId201,那么再从C2打开C1C3,则C2C3taskId仍为201
注意:如果此时你点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是我们应用中的C1 C2 C3中的其中一个。


4.singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

例如:
程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2singleInstance模式。那么程序从D1开始运行,假设D1taskId200,那么从D1启动D2时,D2会新启动一个task,即D2D1不在一个task中运行。假设D2taskId201,再从D2启动D3时,D3taskId200,也就是说它被压到了D1启动的任务栈中。

若是在别的应用程序打开D2,假设OthertaskId200,打开D2D2会新建一个task运行,假设它的taskId201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3task了。

.Intent启动一个新的activity时的Flag属性
      
下图来源于某书上的一段话,已经充分说明了常用的Flag机制
 

                            
  


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android深入解析Activity的launchMode启动模式,Intent Flag,taskAffinity

最近看到一篇文章讲launchMode,想到以前的一次面试,就问了这一个问题,最基本的大家都知道,但是详细的我就迷糊了,最终失败了,所以在此总结一下,希望能够帮助一下大家LaunchMode  lau...

Activity启动模式及Intent的Flag属性对Intent传值的影响

前些时候在支援公司其它部门项目开发的时候,有同事问我:通过Intent在Activity之间进行数据传递,传递的Key和获取的Key都没错,为什么在目标Activity会获取不到传递过来的数据?在Ke...

Intent相关FLAG介绍和Activity启动模式

先首先简单介绍下Task和Activity的关系 Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西(Activity)则会处于最下面,最后添加的东西(Activi...

Activity入门--“生命周期”,启动模式,Intent跳转Flag方式

掌握生命周期对开发者来说很基础,但至关重要,当理解好了生命周期,才可以写出连贯流畅的程序,并且能掌握如何管理应用程序的资源,得到更好的用户体验。 什么是Activity(活动)? 所谓活动就是吸引...

AndroiManifest.xml之Activity (一、关于activity启动模式、属性及Flag的进一步理解)

最近看到索尼的 一、先谈谈activity的启动模式  1、standard    1)每次启动Activity时,都会创建该Activity的新实例    2)总是在当前任务中启动Activity的...

Android activity四种启动模式及Flag

android:launchMode启动模式是Activity启动时的模式,有两种设置方式: 在AndroidManifest.xml中的标签的android:launchMode属性设置 通过代码i...
  • cch1024
  • cch1024
  • 2016年10月12日 16:26
  • 200

Android activity启动模式和flag

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。 standard: Activity的默认加载方法,即使...

Android Activity:四种启动模式,Intent Flags和任务栈

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。那各个页面跳转关系如何决定呢?如果启动了顺序启动了ABCD的Activiy,如何从D调回...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android activity栈、启动模式和intent flag属性详解
举报原因:
原因补充:

(最多只允许输入30个字)