Activity的四种启动模式和Task的理解

一、Task的理解以及SingleTask的使用。

1.Task的理解:我们知道,activity是application的基本组件,而在程序运行的时候,其实就是一系列的activity的使用。所以,我们把对于这一系列的activity的使用的动态过程叫做任务(Task)。

2.SingleTask的使用:SingleTask是android中activity四种启动模式中最难理解的,它表示在应用运行的这个过程中,设置属性为SingleTask的activity只有一个实例对象。当我们第一次启动这个activity时,系统会为它创建一个新的任务,并且初始化一个这样的activity实例,放在新任务的底部。如果下次再启动这个activity,那么就会调用这个activity实例的成员方法onNewIntent,从新激活该activity,所以这个activity也是该任务的根Activity

但是,我们在实际使用的过程中,有时候会发现我们设置了SingleTask的activity,在启动之后返回的并不是当前任务栈中的activity,而是其他的activity,那么这又是因为什么呢?

其实道理是这样的。SingleTask设置了当前activity的启动方式,但是跳转到另外的activity,它也设置启动属性为SingleTask的时候,就会先执行跳转之后的activity的任务栈(Task),当该任务栈执行完成之后,才会回到原来的任务栈执行操作。(Task的执行顺序是:先进后出,后进先出)这里举个例子,如下:

Activity的四种启动模式和Task的理解_第1张图片

这里是:Activity 1 启动 Activity 2, Activity 2 启动 Activity Y, Activity Y 返回 到 Activity X。这里只有Activity Y具有SingleTask属性,而它们的任务栈是这样的:

Activity的四种启动模式和Task的理解_第2张图片

Activity1和Activity2属于一个任务栈,ActivityX 与 ActivityY属于一个任务栈,当执行跳转到ActivityY的时候,也就是进入了Task2任务栈。所以当按返回键的时候,就自然要先执行完成Task2的activity,才会执行Task1的Activity列表。

所以,这里就会出现另一个问题,SingleTask与任务栈Task的关系是什么呢?

这里就要知道activity的属性taskAffinity。当activity设置了SingleTask属性之后,每次启动的时候就会在系统中查找属性值affinity。当找到相同的属性值的时候,就会在该activity所在的Task任务栈中启动Activity;如果没有相同的属性值,则创建新的任务栈,并启动Activity。所以我们就能够理解,为什么上面会出现两个任务栈了,因为在启动activity Y的时候,没有找到原来存在的属性值affinity,所以要创建新的任务栈,并添加Activity Y, 而这个任务栈与Activity1和Activity2不是同一个,但是和Activity X是同一个。

所以,如果想启动一个新的任务栈,那么可以设置他的taskAffinity属性是独一无二的,这样就可以保证启动新的任务栈。


二、activity的四种启动方式:

1.Standard模式:标准启动模式。每次实例化Activity,都会在Task栈顶添加实例,没有任何限制,如图:

Activity的四种启动模式和Task的理解_第3张图片

2.SingleTop模式:如何要实例化的activity位于栈顶,那么使用onNetIntent方法从新启动该Activity,不再创建新的实例并添加到栈中,如图:

Activity的四种启动模式和Task的理解_第4张图片

3.SingleInstance模式:从新开启一个新的任务栈,而且该任务栈中只有一个Activity实例,如图:

Activity的四种启动模式和Task的理解_第5张图片

4.SingleTask模式。上文已经详细解释,这里不再赘述。


参考博客:

http://blog.csdn.net/zhangjg_blog/article/details/10923643


http://blog.csdn.net/luoshengyang/article/details/6714543


你可能感兴趣的:(android知识类)