Android activity四种启动模式及Flag

android:launchMode

启动模式是Activity启动时的模式,有两种设置方式

  1. 在AndroidManifest.xml中的标签的android:launchMode属性设置
  2. 通过代码intent.addFlags(Intent.FLAG_ACTIVITY_*)来设置

TASK(任务栈)

在理解activity启动模式前,我们需要有android的TASK(任务栈)的概念。
通常,我们app存在多次activity跳转的情况下,依次按back键是会回到MainActivity的。因为android系统默认给我们提供了一个以我们包名命名的任务栈。当我们activity依次跳转时,它会将activity 压入默认包名任务栈,栈的结构遵循先进后出

像一个放羽毛球的容器,最后放进去的羽毛球最先出来。

Android activity四种启动模式及Flag_第1张图片

所以我们可以依次回退activity。

一个Application 可以有多个任务栈,可以通过在AndroidManifest某一activity添加android:taskAffinity为不同activity 指定任务栈(不指定就是包名任务栈),因为有多个任务栈, 所以任务栈有前台和后台划分,一个前台任务栈和零个或多个后台任务栈

Android activity四种启动模式及Flag_第2张图片

Activity 中的 android:taskAffinity 这个属性介绍

Activity为Task拥有的一个affinity。拥有相同的affinity的Activity理论上属于相同的Task(在用户的角度是相同的“应用程序”)。
Task的affinity是由它的根Activity决定的。affinity决定两件事情

  1. Activity重新设置所处的Task(参考allowTaskReparenting特性)
  2. FLAG_ACTIVITY_NEW_TASK 标志启动的Activity所处的Task。

默认情况,一个应用程序中的所有Activity都拥有相同的affinity。可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。
如果这个特性没有设置,Activity将从应用程序的设定那里继承下来(参考元素的taskAffinity特性)。应用程序默认affinity的名字是元素中设定的package名

注:以上的 android:taskAffinity 只有通过标志位为FLAG_ACTIVITY_NEW_TASK的Intent启动Activity时,该Activity的这个属性才会生效,系统才会将具有相同Task亲和力的Task切换到前台,然后启动该Activity,否则该Activity仍然运行在启动它的Task中。

android 还提供了许多通过manifest文件对activity属性的设置。
详细请移步android官网api指南 - Activity attributes

四种启动模式

  • standard(标准模式):
    每次激活Activity时(Context.startActivity),都创建Activity实例,并放入Context所处的任务栈,注意,只有Activity才能以standard模式启动,因为只有已存在的activity才有任务栈。

  • singleTop(单一顶部):
    如果任务栈栈顶的Activity.startActivity(自己),则不会创建新的activity,但会调用activity.onNewIntent()回调方法,否则创建Activity实例。

  • singleTask:
    如果要start的那个Activity在任务栈中存在该实例,则不会创建,只会把该Activity以上的Activity实例都弹出任务栈(销毁),则activity 暴露至栈顶,同样,它会调用activity.onNewIntent()回调方法

  • singleInstance:
    如果应用A的任务栈中创建了MainActivity实例,如果应用B也要激活应用A的MainActivity,则不需要创建,两应用共享该Activity实例。

Activity的Flags

  • Intent.FLAG_ACTIVITY_NEW_TASK (默认):
    这个FLAG就相当于启动模式中的singleTask

  • FLAG_ACTIVITY_SINGLE_TOP:
    这个FLAG就相当于启动模式中的singletop

  • FLAG_ACTIVITY_CLEAR_TOP:
    这个FLAG就相当于启动模式中的SingleTask(这个FLAG可以用来关闭多个Activity)

  • FLAG_ACTIVITY_NO_HISTORY:
    类似无痕模式启动一个activity,只要该activity不处于栈顶就销毁,原来是【A,B,C】这个时候再C中以FLAG_ACTIVITY_NO_HISTORY启动D的,D再启动E,这个时候栈中情况为【A,B,C,E】。

  • FLAG_ACTIVITY_CLEAR_TASK:
    如果设置的Context.startActivity(),这个flag将导致task里面的activity会在该activity开始之前被销毁。和FLAG_ACTIVITY_NEW_TASK 配合能够实现退出app所有activity的功能。像这样:

Intent intent = new Intent ( activity, FinishActivity.class );
intent.setFlags ( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity ( intent );

android 还提供了许多其他的Flags属性的设置。
详细请移步 android官网api指南 - Flag属性

你可能感兴趣的:(Android)