Andorid의 taskAffinity 및 FLAGACTIVITY_NEW_TASK

taskAffinity 및 FLAGACTIVITY_NEW_TASK는 모두 activity가 시작될 때 새로운task가 필요한지 여부와 관련이 있다. 우리는 네 가지 상황으로 나뉘어 이 두 로고가 activity를 시작하는 데 미치는 영향을 살펴보자. (전제:MainActivity에서activityA를 시작하는 것)
1), 두 플래그 모두 2로 설정하지 않음), FLAGACTIVITY_NEW_TASK3), 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. 첫 번째 상황을 먼저 본다.
기본 코드:
        
              
                  
                  
              
              

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}  

그의 액션을 시작하는 것과 같은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}  

그의 액션을 시작하는 것과 같은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);   
    }  
        
               
                   
                   
               
               

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가 있어요.
FLAGACTIVITY_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에 있지 않다. 사실 상황은 똑같다. 단지 이때만Android Manifest가 없었다면.xml에taskAffinity를 설정하면 그들 둘의taskAffinity는 다르다.기본적으로taskAffinity가 설정되어 있지 않으면taskAffinity는 가방 이름과 같기 때문에,ActivityA와MainActivity가 한 apk에 없으면FLAGACTIVITY_NEW_TASK의 경우 둘 다 같은 task에 있어야 하지만 FLAGACTIVITY_NEW_TASK는 다른 task에 있을 것이다.
요약:
FLAG를 설정하지 않은 경우ACTIVITY_NEW_TASK, 그리고 하나의 activity에서 다른 activity를 시작합니다. 즉, 소스Record가null이 아니면 새로 시작하는 TaskRecord를 소스Record로 설정하는 TaskRecordFLAG 가 설정되어 있으면ACTIVITY_NEW_TASK,task의affinity,intent,ComponentName 등에 따라TaskRecord가 적합한지 찾기
이 작업의 해석은ActivityStack에 있습니다.Java의 startActivityUncheckedLocked 함수에서 수행됩니다.

좋은 웹페이지 즐겨찾기