任务栈和启动模式

任务栈

在android中,一个activity组件可以激活另一个activity组件(可能属于另一个应用程序)。若一个应用程序激活了另外一个应用的某个activity组件,则这个activity组件会加入到应用程序的进程中。但是从用户的角度来看,感觉像启动了一个新的应用程序。Android是通过将之前的activity组件和新被激活的activity组件放入同一个任务栈来实现这个功能的(默认情况下,可以通过设置属性,将被激活的activity放入另外的任务栈中)。从用户的角度 看,一个任务栈就代表了“一个应用程序”。它实际上是一个栈,里面放着一组被排列好的相关的activity组件。位于栈底的activity(根 activity)就是开启这个任务栈的activity组件,一般情况下,就是应用程序的主界面。而位于栈顶的activity组件即代表当前被激活的 activity组件(可接收用户行为的activity)

任务栈中包含了activity组件的对象,且任务栈中可以包含有某一个activity组件类型的多个实例对象,既任务栈中的实例对象可以重复存在。在任务栈中的activity组件不能被重排序,只能被压栈和弹栈。

任务栈分为前台和后台,当启动了一个应用,那么显示到屏幕上的activity就在前台任务栈中,既该任务栈对应了了个新启动应用。如果按下home键,则会切换到后台,既该任务栈变为后台任务栈。

 

 

亲属关系

         默认情况下,一个应用程序中的activity组件彼此之间是亲属关系――也就是说它们属于同一个任务栈。但是我们可以通过设置某 个标签的taskAffinity属性来为这个activity组件设置亲属关系。在不同的应用程序中定义的 activity组件可以共用同一个亲属关系,或者在同一个的应用程序中定义的activity组件可以使用不同的亲属关系。亲属关系会在两种情况下发挥 作用:

1)负责激活activity组件的Intent对象中包含了FLAG_ACTIVITY_NEW_TASK标志。

 

2)被激活的activity组件的allowTaskReparenting属性被设置为“true”。

 

关于。FLAG_ACTIVITY_NEW_TASK标志量

         默认情况下,一个被激活的新activity会和负责激活它的那个activity组件存在于同一个任务栈中。但是若负责激活的Intent对象包含了 FLAG_ACTIVITY_NEW_TASK标志,则系统会为存放那个即被激活的新activity寻找一个新的任务栈。此时,若已经存在了相同亲属关 系的任务栈,则系统会直接将这个即被激活的新activity放入到这个任务栈中;否则系统会开始一个新的任务栈。

 

关于allowTaskReparenting属性

         若一个activity组件的allowTaskReparenting被置为“true”,则当与这个activity有相同的亲属关系的任务栈被切换到前台的时候,这个activity会从当前存在的任务栈中移动到与其有相同的亲属关系的任务栈中。

 

 

启动模式


         standard(默认模式)、singleTop、singleTask、singleInstance

 

standard:标准模式,activity的默认启动模式,每次启动一个activity系统都会创建一个新的实例。

singleTop:复用栈顶,当启动一个activity,系统会检查任务栈栈顶是否为要启动的activity,若是,则直接回调该activity的onNewIntent()方法的到实例,若不是则创建新的实例。

singleTask: 共享栈,当启动一个activity,系统会在任务栈中检查是否存在,若有,则将该activity调到栈顶,调用onNewIntent()。之前在它上面的activity统统出栈销毁。

singleInstance:共享引用,当activity的启动模式设为这种,则系统会将该activity单独地放置一个任务栈中,既一个activity享有一个独立的任务栈。

 

这几种模式的区别体现以下四点上:

1) 当这个activity被激活的时候,会放入哪个任务栈。对于“standard”和“singleTop”模式,这个新被激活的activity会放入和之前的activity相同的任务栈中――除非如前所述,Intent对象包含FLAG_ACTIVITY_NEW_TASK标志。但“singleTask”和“singleInstance”模式则表示这个新被激活的activity不会放入已经存在的任务栈中,它会重新开启一个任务栈,并作为这个新的任务栈的根activity。

2) 是否可以存在这个activity类型的多个实例。对于“standard”和“singleTop”模式,可以有多个实例,并且这些实例可以属于不同的任务栈,每个任务栈也可以包含有这个activity类型的多个实例。但“singleTask”和“singleInstance”模式则表示至多只可以存在这个activity类型的一个实例。又因为有第一点必须是根 activity的限制,所以这意味着在同一时间,在手机上绝不会存在多于一个的由这个activity启动的任务栈。

3) 包含此activity的任务栈是否可以包含其它的activity。“singleInstance”模式表示包含此activity的任务栈不可以包含其它的activity。若此activity启动了另一个 activity组件,那么无论那个activity组件的启动模式是什么或是Intent对象中是否包含了 FLAG_ACTIVITY_NEW_TASK标志,它都会被放入另外的任务栈。在其它方面“singleInstance”模式和 “singleTask”模式是一样的。

4) 当处理一个新的意图intent事,是否需要一个新的activity:对于默认的“standard”模式,每当响应一个Intent对象,都会创建一个这种activity类型的新的实例。即每一个activity实例处理一个intent。对于“singleTop”模式,只有当这个activity的实例当前处于任务栈的栈顶位置,则它会被重复利用来处理新到达的intent对象。否则就和“standard”模式的行为一样。“singleTask”和“singleInstance”模式表示只能有一个实例,所以这个唯一的实例需要处理所有新到达的 intent对象。又由于“singleInstance”模式的activity实例总是位于任务栈的栈顶,所以这样做很正常。但对于 “singleTask”模式的acitvity,在其上面可能存在其它的activity组件,所以它的位置并不是栈顶,在这种情况下,intent对 象会被丢弃。(虽然会被丢弃,但是这个intent对象会使这个任务栈切换到前台)。如果一个新到达的intent对象是被一个已经存在的activity组件来处理的,那么这个activity的onNewIntent(android.content.Intent)方法会被系统调用。

注意:若为了处理一个新到达的intent对象而创建了一个activity实例,则用户按下“BACK”键就会退到之前的那个activity。但若这 个新到达的intent对象是由一个已经存在的activity组件来处理的,那么用户按下“BACK” 键就不会回退到处理这个新intent对象之前的状态了。

例子:

 

图1


图2


两个任务栈,第一个有A,B ,第二个有C,D 。 当将主界面切换到D时,然后通过按返回键,依次退出activity的流程如图1。当切换到C时,销毁activity的执行流程为图2.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值