注意:(默认和单例)是指定之后才跳转的,也就是说不管栈里之前什么情况,重要的是看你准备跳转的这个activity是什么模式
如果Activities拥有同样的taskAffinity,则它们是亲密的,它们之间在相互跳转时会位于同一个Task中,并不会产生新的task。反之情况比较复杂。
默认情况下,每个Activity都采用和Application相同的taskAffinity,如果Application没有设置的话,则默认使用包名。
taskAffinity只有在和singletask结合使用的时候才会有意义,和其他模式使用没有区别;
1.standard模式
下面只有二三对应情况下创建一个新的activity时,生命流程会调用NewIntent方法
2.singletop模式:
(典型应用场景:消息推送:比如你正在浏览一条微博详情页DetailActivity,这时候微博又给你推送了一条notification,这时候你点了它,跳转到推送给你的那条微博的详情页DetailActivity,两个都是同样的DetailActivity,不需要按照standard模式来创建一个新的DetailActivity,要不然用户点击返回的时候会很好奇为什么他点击返回还是在详情页呢(仔细用自己的亲身体会想一想)).
(非常特殊的一种情况:当栈中只有一个Aactivity时,且为singletop,按下home键然后再返回应用,会调用onNewIntent而非onRestart)
当处于栈顶的时候,就会调用NewIntent;
3.singletask
(典型应用场景:A--->B---->C---->D,然后D想直接返回到A,而且不重新创建一个A的Activity,这时候就可以指定A为singletask)
(非常特殊情况:Aactivity是栈底并且是singletask,启动一个标准模式的Bactivity,B再启动标准模式C,这时候按下home键,将会调用Aactivity的onNewIntent,并且将Aactivity以上的activity全部清除;但是!如果A是标准模式,B是singletask是不会出现清理栈的情况的,仍然会回到C的界面)
当activity在栈中存在就会调用NewIntent
. 在taskAffinity属性相同时,第一次创建Activity实例时,并不会启动新的task,而是直接添加到原有task。非第一次启动,将Activity所在task中Activity之上的全部Activity删除,然后跳转到该Activity中。
. 在taskAffinity属性不相同时,第一次创建Activity实例时,会启动新的task,并将实例添加到新创建的task中。非第一次启动,将Activity所在task中Activity之上的全部Activity删除,然后跳转到该Activity中。
4.singleinstance模式(指定的这个activity会自己开一个栈):
(应用场景:类似直接全局跳转到拨打电话界面)
例子:
答案是四次
如果之前不存在这个singletask模式的activity,那么新建一个task存放;如果已经有了这样一个activity,那么直接就让它显示在前台,且会调用onNewIntent方法;
Intent的Flag:
FLAG_ACTIVITY_SINGLE_TOP: 和singletop的效果是一样的;
FLAG_ACTIVITY_NEW_TASK(默认),即standard模式
在taskAffinity相同时,表现和standerd相同,并将该栈移动到前台。
在taskAffinity不相同时,新建一个栈并存放
FLAG_ACTIVITY_CLEAR_TASK
常用 FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK后,可以使得有这个标识的activity新建一个task并当做栈底存入,并且此前包含了这个activity的栈都会被关闭。
FLAG_ACTIVITY_CLEAR_TOP
1.单独使用时,ABCD 启动 B(B是启动模式是standard的,flag是CLEAR_TOP) ,会销毁B和B以上的实例 变成 AB ,B 重新执行onCreate -> onStart;
2. FLAG_ACTIVITY_CLEAR_TOP/FLAG_ACTIVITY_SINGLE_TOP搭配使用,效果和singletask的效果是一样的,且最上面的Bactivity会被复用(调用onNewIntent)。
这给我们提供一个思路:A-->B-->C-->D,在D想退出程序,这时候如果finish,只能结束一个activity,但是如果A设为cleartop|single_top的flag,跳转到A,这时候栈中将只剩下A,这时候在onNewIntent中finish是最合适的;
3.一般FLAG_ACTIVITY_CLEAR_TASK/FLAG_ACTIVITY_CLEAR_TOP搭配使用。
如果用来start根activity,它将会在此task任务当前正在执行的实例bring to foreground,然后清除到根状态。比如,当从notification manager启动一个activity。表现的和singleTask一样? 并且最上面的activity会被复用?(即调用onNewIntent)
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:
https://blog.csdn.net/pbm863521/article/details/78206461
总结一下该博客的内容:如果采用该flag启动的activity,将不会在最近任务列表中出现(指的是栈底的activity才会有用);
假设A-->B(前提A和B同栈,如果不同栈那么就无法作用其他栈,只能针对自己栈有效果),A在xml中设置了该flag,那么无论通过什么adb指令简介去调用Bactivity都不会在最近任务列表中出现该应用的后台;
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:
一般与FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET结合使用,如果设置该属性,这个activity将在一个新的task中启动或者或者被带到一个已经存在的task的顶部,这时这个activity将会作为这个task的首个页面加载。将会导致与这个应用具有相同亲和力的task处于一个合适的状态(移动activity到这个task或者从中移出),或者简单的重置这个task到它的初始状态
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:在当前的Task堆栈中设置一个还原点,当带有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的Intent请求启动这个堆栈时(典型的例子是用户从桌面再次启动这个应用),还原点之上包括这个应用将会被清除。应用场景:在email程序中预览图片时,会启动图片观览的actvity,当用户离开email处理其他事情,然后下次再次从home进入email时,我们呈现给用户的应该是上次email的会话,而不是图片观览,这样才不会给用户造成困惑。