Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK

本文详细探讨了Android中taskAffinity和FLAG_ACTIVITY_NEW_TASK在启动activity时的作用,通过四种不同情况分析它们如何影响任务栈的创建。在默认情况下,不设置这两个标志会如何,仅设置FLAG_ACTIVITY_NEW_TASK或taskAffinity会产生何种效果,以及同时设置两者时的行为。总结指出,未设置FLAG_ACTIVITY_NEW_TASK时,新activity会加入源activity的任务栈;而设置该标志会根据affinity等因素决定是否创建新任务栈。
摘要由CSDN通过智能技术生成

taskAffinity 和 FLAG_ACTIVITY_NEW_TASK都是和activity启动时是否需要新建一个task有关,我们分四种情况看一下这两个标志对启动activity的影响:(前提:从MainActivity中启动ActivityA)

1)、两个标志都不设置
2)、有FLAG_ACTIVITY_NEW_TASK  
3)、无FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)
4)、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

注意上面的标志都是针对于启动的ActivityA,FLAG_ACTIVITY_NEW_TASK  是在启动ActivityA的Intent中设置的,taskAffinity 是在AndroidManifest中ActivityA中设置,另外注意这里两个actiity的启动模式都设置为standard

1、先看第一中情况:

主要代码:

    <activity android:name=".ActivityA"    
               android:launchMode="standard"  
             android:label="@string/title_activityA">    
          <intent-filter>    
              <action android:name="com.leaves.ipanel.ActivityA"/>    
              <category android:name="android.intent.category.DEFAULT"/>    
          </intent-filter>    
           </activity>   


MainActivity启动activity
    public void onClick(View arg0) {  
            // TODO Auto-generated method stub  
            Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
            Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
        
            startActivity(intent);   
        }  


启动A之后的堆栈:
    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
      Main stack:  
        TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
          Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA}  
            Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA }  
            ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  
          Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
            ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  
        TaskRecord{41350f60 #2 A com.android.launcher U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
          Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
            ProcessRecord{41615818 628:com.android.launcher/1000}  


可见,跟启动他的activity同属于一个task.

2、有FLAG_ACTIVITY_NEW_TASK  

我们添加FLAG_ACTIVITY_NEW_TASK  

    public void onClick(View arg0) {  
        // TODO Auto-generated method stub  
        Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
        Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);   
    }  


启动A之后的堆栈
    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
      Main stack:  
        TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
          Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA}  
            Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA }  
            ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  
          Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
            ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  
        TaskRecord{41350f60 #2 A com.android.launcher U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
          Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
            ProcessRecord{41615818 628:com.android.launcher/1000}  

可见,跟启动他的activity还是同属于一个task.

3、无FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)


    public void onClick(View arg0) {  
        // TODO Auto-generated method stub  
        Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
        Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
          
        startActivity(intent);   
    }  


    <activity android:name=".ActivityA"    
                android:launchMode="standard"  
                android:taskAffinity="com.leaves.test.ActivityA"  
              android:label="@string/title_activityA">    
           <intent-filter>    
               <action android:name="com.leaves.ipanel.ActivityA"/>    
               <category android:name="android.intent.category.DEFAULT"/>    
           </intent-filter>    
            </activity>   

查看一下启动A之后的堆栈:
    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
      Main stack:  
        TaskRecord{415ebce8 #37 A com.leaves.ipanel U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
          Hist #2: ActivityRecord{42358368 u0 com.leaves.ipanel/.ActivityA}  
            Intent { act=com.leaves.ipanel.ActivityA cmp=com.leaves.ipanel/.ActivityA }  
            ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  
          Hist #1: ActivityRecord{4132a3d0 u0 com.leaves.ipanel/.MainActivity}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
            ProcessRecord{42384ad8 7591:com.leaves.ipanel/u0a10061}  
        TaskRecord{41350f60 #2 A com.android.launcher U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
          Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
            ProcessRecord{41615818 628:com.android.launcher/1000}  

跟前面两种情况是一样的。

4、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

把FLAG_ACTIVITY_NEW_TASK添加上去


    public void onClick(View arg0) {  
        // TODO Auto-generated method stub  
        Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
        Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);   
    }  

查看一下启动A之后的堆栈:

    ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
      Main stack:  
        TaskRecord{4140d4c8 #42 A com.leaves.test.ActivityA U 0}  
        Intent { act=com.leaves.ipanel.ActivityA flg=0x10000000 cmp=com.leaves.ipanel/.ActivityA }  
          Hist #2: ActivityRecord{416b48d8 u0 com.leaves.ipanel/.ActivityA}  
            Intent { act=com.leaves.ipanel.ActivityA flg=0x10000000 cmp=com.leaves.ipanel/.ActivityA }  
            ProcessRecord{41393ed0 8028:com.leaves.ipanel/u0a10061}  
        TaskRecord{4231cf40 #41 A com.leaves.ipanel U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
          Hist #1: ActivityRecord{413c8430 u0 com.leaves.ipanel/.MainActivity}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.leaves.ipanel/.MainActivity }  
            ProcessRecord{41393ed0 8028:com.leaves.ipanel/u0a10061}  
        TaskRecord{41350f60 #2 A com.android.launcher U 0}  
        Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
          Hist #0: ActivityRecord{41616790 u0 com.android.launcher/com.android.launcher2.Launcher}  
            Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher/com.android.launcher2.Launcher }  
            ProcessRecord{41615818 628:com.android.launcher/1000}  

可以看到,这次终于在一个新的task中启动了ActivityA.

上面我们测试的两个Activity是在同一个应用中,如果他们在不同的应用中呢,例如ActivityA跟MainActivity不在一个apk中,其实情况还是一样的,只是这个时候,如果没有在AndroidManifest.xml中设置taskAffinity,则他们两个的taskAffinity是不一样的。因为默认如果没有设置taskAffinity,则taskAffinity跟包名是一样的,所以,如果ActivityA跟MainActivity不在一个apk中,当没有FLAG_ACTIVITY_NEW_TASK时,则两者应该是在同一个task,但是如果有FLAG_ACTIVITY_NEW_TASK,则两者应该会在不同的task中。


总结:

如果没有设置FLAG_ACTIVITY_NEW_TASK,且是从一个activity中启动另一个activity,即sourceRecord不为null,则设置新启动的TaskRecord为即sourceRecord的TaskRecord
如果设置了FLAG_ACTIVITY_NEW_TASK,则根据task的 affinity、intent、ComponentName等查找是否有合适的TaskRecord

这些工作的解析还是在ActivityStack.JavastartActivityUncheckedLocked函数中进行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值