launchMode&taskAffinity

1、设置一个launchMode

一般地,我们可以直接在AndroidManifest.xml 标签的一个属性中设置launchMode,如下:


  • standard
    默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

  • singleTop
    如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

  • singleTask
    如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

  • singleInstance
    在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

singleTop,singleTask,singleInstance,如果不需要创建新的实例(不调用onCreate),则会调用onNewIntent,当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。

2、Intent Flags

当开启一个activity时,可以通过在intent中包含标志来修改activity的默认的与当前task的关联,然后将该intent传递给startActivity().可以修改的默认的标志为:

 FLAG_ACTIVITY_NEW_TASK
 FLAG_ACTIVITY_SINGLE_TOP
 FLAG_ACTIVITY_CLEAR_TOP
 FLAG_ACTIVITY_REORDER_TO_FRONT
    1. 如果已经启动了四个Activity:A,B,C和D。在D Activity里,我们要跳到B Activity,同时希望C finish掉,可以在startActivity(intent)里的intent里添加flags标记,如下所示:
    Intent intent = new Intent(this, B.class);    
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);   
    startActivity(intent);  
    1. 如果已经启动了四个Activity:A,B,C和D,在D Activity里,想再启动一个Actvity B,但不变成A,B,C,D,B,而是希望是A,C,D,B,则可以像下面写代码:
    Intent intent = new Intent(this, MainActivity.class);   
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);    
    startActivity(intent);  

3、taskAffinity

在官方文档中可以得到关于taskAffinity的以下信息:

  • taskAffinity表示当前activity具有亲和力的一个任务(翻译不是很准确,原句为The task that the activity has an affinity for.),大致可以这样理解,这个 taskAffinity表示一个任务,这个任务就是当前activity所在的任务。
  • 在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务。
  • 一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity。
  • 这个属性决定两件事:当activity被re-parent时,它可以被re-paren哪个任务中;当activity以FLAG_ACTIVITY_NEW_TASK标志启动时,它会被启动到哪个任务中。(这个比较 难以理解,请结合中的属性allowTaskReparenting和Intent中的标志 FLAG_ACTIVITY_NEW_TASK加以理解)
  • 默认情况下,一个应用中的所有activity具有相同的taskAffinity,即应用程序的包名。我们可以通过设置不同的taskAffinity属性给应用中的activity分组,也可以把不同的应用中的activity的taskAffinity设置成相同的值。
  • 为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task。

http://blog.csdn.net/zhangjg_blog/article/details/10923643

你可能感兴趣的:(launchMode&taskAffinity)