码迷,mamicode.com
首页 > 其他好文 > 详细

Task 和 Activity 回退栈操作。

时间:2015-04-02 09:08:33      阅读:1739      评论:0      收藏:0      [点我收藏+]

标签:回退栈   task   任务   intent flag   launch mode   

首先说一下Task是一个什么概念吧:Task是一个包含activity的列表。没

错,简单的说就是按照启动的先后来排队的一个队列。Back Stack,就是回退栈的意思:那么有什么用?Back Stack是存储一个Task的实现方式,一个容器。它具有栈的特性:后进先出。

那么,依据什么来把activity指定给某个Task

------默认情况下,根据activity的启动的顺序,加入A启动了B,那么B默认情况下就放到了

ATaskBack Stack里面啦。当然,你也可以去修改这一个默认的行为。在下面的一些部分会讲述怎么去修改的啦。

 

需要注意的一点是:假如一个activity在一个新的task里启动且没有其他直接启动的方法(即不是MainLaunchactivity),然后按下Home键离开了该Task,然后通过启动图标来返回应用的话,是无法回到该activity的。

 

 

1.保存activity的属性和状态:

 

默认情况下,activity脱离前台进入后台运行的时候,系统会自动保存它的配置信息,当用

户返回到activity的时候,可以自动的复原.

然而当过了比较长的一段时间后或者系统需要回收内存什么的,会清除掉它的配置信息,

用户返回到该activity的时候会重新的启动该activity.

那么这种情况下如果要把以前做的重新再来一遍,这用户体验想想就觉得不妥啊.那么我

们需要自己去保存和恢复activity的配置信息.then ,how?

实现onSaveInstanceState()方法,把所需的属性信息保存到bundle.

onCreate()方法里会有一个Bundle参数,如果不为空的话证明了之前是有一些信

信息是保存在这里的,我们就可以利用里面的信息去恢复用户原本处于的状态,这样子用户的体验是不是就好狠多啦?嘿嘿嘿嘿嘿

 

2.管理Task

如开头所说,我们可以修改系统的默认行为(即如果A启动了B,会把B放入A所在的TaskBack Stack里),那么,有两种方式可以做到:

 

A.startActivity(Intent intent)intent中定义flag

intent.setFlags(flag);

系统会根据intent所定义的flag来对所被启动的activity来指定特定的Task

B.Manifest文件中该activity标签下的属性

 

 

同样系统会根据属性里所定义的值来对被启动的activity进行指定task

 

在这两种方式中,有一些效果是flag有而manifest文件没有的,同样也有一些效果

值是manifest文件有而flag所没有的。

 

当这两个值被同时设置的时候,flag的效果会覆盖launchMode所设置的效果。

 

下面,我们分别来对这两种不同方式的常用值来做简单的介绍。

 

一。定义启动activitymode

 

假设A>>B>>C

A:定义manifest文件里launchMode属性:

 

"standard" (默认值)

这是launchMode的默认值,假定ClaunchMode为该值,若B启动C那么C也会放到B所属的Task里。C可以被初始化(即启动)多次,可属于不同的Task(即若与B不同TaskD启动了C,那么C新建一个实例放到D所在的Task里);一个Task里可以有多个C的实例(即若A>>B>>C>>A>>C,那么该任务的回退栈里有两个C的实例)

 

"singleTop"

中文意思是:顶部唯一。假定ClaunchMode的属性值为该值。什么意思呢?就是说,在一个Task的顶部,只能有一个C的实例,即若A>>B>>C然后在C里再次startActivity C,不会再创建一个C的实例,而是把该启动CIntent传入到CActivity onNewIntent()方法里。回退栈的结构依然是:A>>B>>C而不是A>>B>>C>>C.这样的话,就会出现一个随之产生的结果:任何时候C的实例都不会连续出现两次。同样与默认值类似,C也可以属于不同的Task(C不管任务是谁,它只跟着动了它的activity在一起),单个Task里可以有多个C的实例。(但不会出现连续)

 

"singleTask"    

(中文:单个任务)假定activityClaunchMode值设置为该值。那么意味着无论何时C被启动,它都会在一个独立的Task里启动。不过注意哦,独立的Task并不是意味着新的Task。当C的独立的Task已经存在(即C被启动过)了,那么当再次调用C Activity的时候,就不会再创建了,而是把该Task移到前台来。(这也意味着,在同一时间,只会有一个C的实例存在。)

 

注意:尽管CTask并不是与BTask一致,但当用户按下back按钮的时候仍然可以回到B。还有C的单独的Task里也可以有其他的Task,同时C并不一定要求是该任务的根activity

 

"singleInstance".

(中文:单例)假定C定义了该模式。singleTaskmode也有单例效果,但该模式与singleTask不同的是,C所在的Task里只能有它自己一个Activity,不会包含其他activity。(突然就想到:如果B启动了C,然后C启动了D,那么D是在另一个新的Task里还是B所在的Task里呢?如果有人知道希望可以分享一下哈~

 

这里有一个关于singleTask的图解嘿嘿,来自官方guide文档》》》》

技术分享

技术分享

图的下方有备注~自己琢磨琢磨吧,挺容易懂的了。


B.IntentFlag属性

假设回退栈里有A>>B>>C

(A启动BB启动C)

 

  • FLAG_ACTIVITY_NEW_TASK
    • 效果与launchModesingleTask属性一样。
    • 当在C启动Dintent中定义了这个flag的时候,D会启动放置在一个新的Task里,即一个新的Back Stack里。如果D已经被启动过一次然后到了后台运行(即A>>B>>C>>D>>E)再从E去启动D使用这一个flag的话,不会再次创建一个Task,而是把之前的D所在的Task恢复到前台,而D也会接收到一个Intent通过onNewIntent()方法。

@Override

protectedvoid onNewIntent(Intent intent) {

super.onNewIntent(intent);

}

 

  • FLAG_ACTIVITY_CLEAR_TOP
    • 中文(清除activity的前方)假设C定义了该属性。
    • 如果A>>B>>C>>D>>E。然后E启动activity C,那么并不会再创建一个C的实例,而是清除C前面的activity,恢复C的状态,显示C给用户看嘿嘿嘿,多霸气。
    • 同时,manifest文件中launchMode并没有与之对应的属性值。

 

 

回退栈的清空

默认情况下,如果用户长时间不反悔该回退栈,那么由于种种原因(回收内存节省资源等等啦),会对该回退栈进行清空处理,只留下一个最底部的activity留在栈内,所以当用户返回到这个Task时,只会修复呈现栈最开始的一个activity

 

同样,我们也可以对这种默认的行为作出修改:

alwaysRetainTaskState

 技术分享

技术分享

 

当这个回退栈的根activity的该属性被设置为true时,那么无论用户隔了多长时间再回来,这个栈都不会被清除。

但要注意的是,必须要把该属性定义在回退栈的根activity才有效。

 

clearTaskOnLaunch

 技术分享

 技术分享


 

这个属性与alwaysRetainTaskState属性的效果刚好相反。只要用户一离开当前的Task,那么回退栈就会被清空只留下根activity。就算是刚离开又马上点击回来也是如此。同样该属性也必须定义在某个Task的根activity上才有效。

 

finishOnTaskLaunch

 

 技术分享技术分享

 

 

这个属性有点像clearTaskOnLaunch的属性效果,但与之不同的是它所作用的范围是单个activity(任何activity都行)而clearTaskOnLaunch的作用域是整个Task。被定义了该属性的activity会在用户离开所在Task之后被清除。(只是清除Task里的这个activity。




taskAffinity属性及其使用方法:这个。。感觉比较少用啊,,,(说实话就是我比较懒)如果想要了解一下的话自行查阅哈。官方guide文档里的Task and Back Stack里有的。


Task 和 Activity 回退栈操作。

标签:回退栈   task   任务   intent flag   launch mode   

原文地址:http://blog.csdn.net/zuolovefu/article/details/44827125

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!