1.关于singleTask
来自 Android 开发指南的Application Fundamentals 页面:
默认情况下,一个
应用程序对每个都有亲和力
其他——也就是说,有一个偏好
让他们都属于同一个
任务。
一个“singleInstance”活动代表
单独作为其唯一的活动
任务。如果它开始另一个活动,
该活动将启动为
不同的任务,不管它
启动模式——好像
FLAG_ACTIVITY_NEW_TASK 在
意图。在所有其他方面,
“singleInstance”模式等同于
“单一任务”。
如上所述,没有更多
比“singleTask”的一个实例或
“singleInstance”活动,这样
实例预计将处理所有新的
意图。 “单一实例”活动
总是在栈顶
(因为它是唯一的活动
任务),所以它总是可以
处理意图。然而,一个
“singleTask”活动可能会也可能不会
在它上面有其他活动
堆。如果有,则不在
处理意图的位置,以及
意图被放弃。 (尽管
意图被放弃,它的到来将
已经导致任务来到
前景,它将保留在哪里。)
由于任何一种启动模式都不会有超过一个 Activity 实例,因此后退按钮将始终将您带到您的情况下的现有 Activity 实例。
一个重要的区别是“singleTask”不需要在选择某项时为正在启动的新活动创建新任务。它也不必每次都删除后退按钮上的新任务。
由于您的 Activity 堆栈确实都与一个用户“任务”有关,而且听起来您没有一个复杂的 Intent 结构,其中 singleInstance 可能有助于始终处理它们,我建议使用 singleTask 启动模式。
这里有一篇很好的博文,可以了解更多信息,以及图片的功劳:Android Activities and Tasks series – An introduction to Android’s UI component model
2.关于单顶
如果一个启动在singleTop模式下的activity的实例已经存在于任务栈栈顶,那么在没有创建新实例的时候重启Activity,但是在这种情况下复用栈顶,并且会调用 onNewIntent () 方法的实例将 Intent 对象传递给该实例。比如A的启动方式singleTop,一个example和A已经存在于栈顶,那么在A启动的时候调用startActivity (New Intent (this, A.class)),不会再创建A实例,而是复用原来的example,并调用onNewIntent (method) 的原始实例。这是此任务堆栈或 A 的示例。
如果一个在singleTop模式下启动的activity已经存在并且任务栈中,但不在栈顶,那么它的行为和标准模式一样,也会创建多个实例。可以看understand-android-activity-launchmode
编辑
这不是多余的。
为了记录用户打开的那些activity,记录这些activity打开的顺序,谷歌引入了任务栈的概念,以帮助保持良好的用户体验。
activity的启动模式会影响任务栈。Intent标志也会影响任务栈。
可以在代码中修改任务栈模式,而不用在manifest文件中修改,flags可以直接影响任务栈。
就像android:text="content"在xml代码中。而 tv.setText("content");在java代码中。