【译】Sth. about Android Activity Task

原文链接:Reference

FLAG_ACTIVITY_REORDER_TO_FRONT

如果当前包含实例,reorder到最上面,否则新建。

FLAG_ACTIVITY_BROUGHT_TO_FRONT

当启动一个已经实例化的具有singleTask配置的Activity时,系统自动添加。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

为将要启动的Activity和随后在它上面的Activity进行标记,当task被reset的时候,将它们从栈中移除。当Task从后台进入前台的时候,只要设置了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,Task会立刻重置(reset)。这个标记在Task从Home Screen、Main Menu、Recently Tasks页面恢复的时候,会被系统自动添加(也就是说Task会重置)。

这个标记可以被用来标记某个Activity,一旦Task进入后台,从它开始的所有Activity都会被“forgetten”。

FLAG_ACTIVITY_CLEAR_TOP

如果当前的Task中包含这个Activity的实例,则会将这个实例提到栈顶,而不是重新创建实例;同时,该实例之上的所有Activity均会被移除。例如:假设当前的Task是ABCDE,使用该标记启动Activity-C,会将D、E都清除,栈会变成ABC。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

通常情况下,如果在一个新的Task中启动Activity,目标Activity会出现在Recently launched Activities(最近启动)列表里。比如,从你的Activity打开一个浏览器Activity。使用这个标记,我们可以抑制这个行为,将目标Activity从最近启动列表中排除。

FLAG_ACTIVITY_NO_HISTORY

如果设置了这个属性,Activity将不会被保留在Task中。只要用户从这个页面离开(包括打开了一个新的Activity),这个Activity就会被关闭。还可以通过noHistory设置。

如果设置了这个标记,onActivityResult就不会再回调了。

FLAG_ACTIVITY_FORWARD_RESULT

默认情况下,如果想将Activity-B中的结果回传给A,A要通过startActivityForResult(Intent)方法(而不是startActivity(Intent))启动B。如果B通过setResult(int resultCode)设置了结果,A中的onActivityResult()回调就会被自动调用,A可以从回调中获取结果。

假如B启动了另一个Activity-C,这才是设置结果的地方,并且我们希望这个结果能传输给A,如果不希望在B中手动设置结果,可以使用Android提供的这个Flag。

在这个例子中,B启动C的时候添加这个标记,并且使用startActivity(Intent)方法启动。C中设置的结果,在C、B都结束的时候,会自动传给A。A中的onActivityResult()回调会自动调用,但是B中的并不会,因为B只是传输而不是处理结果。

注意,这个Flag只能和startActivity()方法联合使用,因为startActivityForResult()方法会标记传输的终点,并且在回调中处理所有的结果。(如果B使用了后面的方法,结果在B中就处理完了,A拿不到)

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

这个标记在Activity从最近启动列表中打开时由系统添加。

FLAG_ACTIVITY_MULTIPLE_TASK

这个Flag只有和FLAG_ACTIVITY_NEW_TASK一起使用时才有效果。如果同时使用,(总)会(可能会忽略掉其他配置项)创建一个新的Task,并且将Activity作为栈底且唯一的元素。

FLAG_ACTIVITY_NEW_TASK

在不同时使用FLAG_ACTIVITY_MULTIPLE_TASK标记的情况下,如果当前有Task包含设置了affinity属性的目标Activity实例,则不会新建Task,并将目标Activity实例放到现有的Task当中;反之则会新建Task。

因为同一Application中所有的Activity都会被指定一个默认的affinity来保证其都在同一个Task中,使用这个标记启动相同Application中的Activity将不会新建Task,除非和FLAG_ACTIVITY_MULTIPLE_TASK同时使用。

FLAG_ACTIVITY_NO_ANIMATION

2.0中引入,这个标记会禁用Activity切换动画。例如,这个标记可以用在不需要用户触发的Activity启动,用来只展示一次动画。

FLAG_ACTIVITY_NO_USER_ACTION

这个标记用来表明切换Activity并不是用户的直接操作,而是自动完成的。例如“来电”Activity是设备收到来电的时候自动启动的。从技术上,这个标记表明调用者Activity的onUserLeaveHint()回调方法不会调用。

FLAG_ACTIVITY_REORDER_TO_FRONT

如果当前栈中有被调用者Activity的实例,这个实例就会被移到栈顶,而栈中的其他元素则会保留原样,这样实际上是改变了栈的顺序。假设当前栈为ABCDEF,启动Activity-C会使得栈的顺序变为ABDEFC。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

这个标记在创建新栈或将现有栈激活到前台时有效。这种情况下,栈会被重置,意味着Task Affinities会被重新应用(Activities会移入或移除栈)并且设置了FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET标记的Activity会被清理。

FLAG_ACTIVITY_SINGLE_TOP

如果目标Activity在栈顶,那么不会重新创建实例。


STANDARD

默认行为

SINGLETOP

如果相同实例在栈顶,则不会创建新的实例,而是进行复用。相反,行为同STANDARD
复用时,应该使用onNewIntent(Intent)方法创建

SINGLETASK

该Activity总是作为新Task的栈底元素启动。如果当前有一个实例(当前栈或者其他栈),第二次启动Activity会通过onNewIntent将intent传给已经存在的Activity。

这个行为用作App的入口非常使用。如此配置的话,你就可以强制总是通过一个新的栈来启动,同时,你也可以保证这个Activity不会被重复实例化。

SINGLEINSTANCE

类似SINGLETASK但是不会让所在的栈中出现其他Activity,一旦启动了其他Activity,另外的Activity就会被放入新建的栈中,就像设置了FLAG_ACTIVITY_NEW_TASK标记一样。

这个属性的场景很少,任何从这个Activity启动的Activity都被放入了新的栈,所以当用户回到这个Activity中时,上面的Activity都不会被恢复(不在一个栈中)。多数场景下都不需要。

这个属性在门户App中比较有用,这种App用来启动其他App的Activity,设置成这个属性之后,就不需要特别指定FLAG_ACTIVITY_NEW_TASK标记了,用户回来的时候,也不会看到其他应用的Activity(这个栈中只有自己)。


alwaysRetainTaskState

防止应用进入后台之后,Task被清理。再次激活这个Task的时候,会恢复之前的状态。

但是要注意的是,内存不足时,系统可能会kill掉App的进程。

CLEARTASKONLAUNCH

每次从Home启动的时候,都重新加载栈,清除Root Activity以上的所有状态。


FINISHONTASKLAUNCH

从Launcher重新进入Task时将Activity结束。从最近启动列表进入时,不会。

NOHISTORY

只要用户离开了这个Activity,就再也回不去了,包括从下级页面返回,只要设置了NOHISTORY,就回不到这个页面。