一 Activity的LaunchMode
1 standard:当用ApplicationContext去启动standard模式的activity时会报错,这是因为standard模式启动的Activity会默认进入启动它的Activity所属的任务栈,但是由于非Activity类型的Context并没有所谓的任务栈。
2 singleTop:新Activity位于任务栈栈顶时不重新创建,调用onNewIntent,通过其参数可获得当前请求的信息,不在栈顶时则重新创建。
3 singleTask:只要Activity存在一个栈中就不会创建新的实例,回调onNewIntent。具体:当一个具有singleTask模式的Activity启动后,系统会首先寻找是否存在Activity所要的任务栈,没有则创建一个任务栈再把Activity放进去,有的话则查看是是否已经存在Activity实例,存在则把其上面的所有Activity出栈,把它调用到栈顶并调用onNewIntent。
4singleInstance:启动具有该模式的Activity后系统会为他开启一个新的任务栈,且其独自在这个任务栈中。
当系统采用singleInstance模式加载Activity时,又分为以下
045.
* 两种情况:
046.
* (1)如果将要启动的Activity不存在,那么系统将会先创建一个
047.
* 全新的Task,再创建目标Activity实例并将该Activity实例
048.
* 放入此全新的Task中
049.
* (2)如果将要启动的Activity已存在,那么无论它位于哪个应用
050.
* 程序,哪个Task中;系统都会把该Activity所在的Task转到
051.
* 前台,从而使该Activity显示出来
.以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中。被singleInstance模式的Activity开启的其他activity,能够在新的任务中启动,但不一定开启新的任务,也可能在已有的一个任务中开启。
二 任务栈:task
1. 所属Task的区别:
一个Task中的Activity可以来自不同的App,同一个App的Activity也可能不在一个Task中。
一般情况下,,“standard”和”singleTop”两种加载模式 源Activity(即new Intent(arg0,arg1)中的第一个参数)和目标Activity(即new Intent(arg0,arg1)中的第二个参数)在同一个Task内, 除非Intent包括了参数FLAG_ACTIVITY_NEW_TASK,如包含了此参数,目标Activity会起动到新的Task里;
“singleTask”和“singleInstance” 总是把目标Activity作为一个Task的根元素,他们不会被启动到一个其他Task里。
故假如应用1的Activity A开启应用2的Activity B时,若Activity B的启动模式为“standard”或”singleTop”时,A B在同一个任务栈中;当Activity B的启动模式为“singleTask”或者加上FLAG_NEW_TASK标志时,A B 不再同一个任务栈中,这里涉及到一个参数,TaskAffinity,这个参数标识了一个Activity所需要的任务栈的名字。拥有相同affinity的多个Activity理论同属于一个task,task自身的affinity决定于根Activity的affinity值。affinity在什么场合应用呢?1.根据affinity重新为Activity选择宿主task(与allowTaskReparenting属性配合工作);2.启动一个Activity过程中Intent使用了FLAG_ACTIVITY_NEW_TASK标记,根据affinity查找或创建一个新的具有对应affinity的task。默认情况下,一个应用内的所有Activity都具有相同的affinity,都是从Application(参考<application>的taskAffinity属性)继承而来,而Application默认的affinity是<manifest>中的包名,我们可以为<application>设置taskAffinity属性值,这样可以应用到<application>下的所有<activity>,也可以单独为某个Activity设置taskAffinity。
当taskAffinity和singleTask启动模式搭配时,它是具有该模式的Activity的目前栈的名字。
taskAffinity还可以和allowTaskReparenting结合使用。这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“true”表示可以移动,“false”表示它必须呆在当前应用的task中,默认值为false。具体参考http://blog.csdn.net/liuhe688/article/details/6761337。
http://www.cnblogs.com/franksunny/archive/2012/04/17/2453403.html