美文网首页
launchMode&taskAffinity

launchMode&taskAffinity

作者: 鲁西西z | 来源:发表于2018-03-08 10:57 被阅读12次

    1、设置一个launchMode

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

    <activity
            android:name=".SingleTaskActivity"
            android:label="singleTask launchMode"
            android:launchMode="singleTask">
    
    • 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标志启动时,它会被启动到哪个任务中。(这个比较 难以理解,请结合<activity>中的属性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

          本文链接:https://www.haomeiwen.com/subject/yevefftx.html