Intent StartActivity() 호출 직후 onActivityResult() 호출 이슈

2022. 1. 8. 21:15Android/개발 CASE

반응형

[이슈] startActivityForResult() 호출 직후 onActivityResult()가 호출됨

[원인] Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 지정 후 startActivity()를 호출해서 onActivityResult()가 바로 실행된 것이었음

[해결] Intent에 해당 Flag 지정하지 않고 실행

 

[참고]

  • Task란? App에서 실행되는 Activity를 보관하고, 관리하는 스택
  • Flag란? Task내 액티비티 제어 방식
  • Flag 사용법
    1. AndroidManifest에서 원하는 Activity의 launchMode 속성을 사용해 적용(4가지 모드만 지원, 특수 경우 제외하고, 일반적으로 standard/singleTop만 사용)
      1. standard : 스택 중 어느 곳에나 위치 가능하며 여러개의 인스턴스가 생성(기본적으로 설정되는 값)
      2. singleTop : standard 방식 + 호출 activity가 최상위 activity와 동일한 경우 최상위 activity 재사용(기존 최상위 activity pop) 
        - 시나리오 : Activity A - sigleTop
      3. singleTask : 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능(타 Task에서 동일 activity 사용 불가)
        - 시나리오 : Activity C - singleTask
      4. singleInstance : 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능, Task 내에 하나만 생성되므로 호출하게 되면 새로운 Task가 생성됨(하나의 Task에 하나의 Activity만 존재할 수 있음-->?? 그럼 sigleInstance에서 standard 호출해도 새로운 Task가 생긴다는건가..?)
        - 시나리오 : Activity A, B, C - sigleInstance
    2. intent.addFlags() 호출해 원하는 Flag 지정
      1. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET : Task가 리셋될 때 플래그가 사용된 액티비티부터 위의 액티비티가 모두 삭제
        ex> ABCDE -> B call -> AB(새로운 B)
      2. FLAG_ACTIVITY_CLEAR_TOP : 호출하는 Activity가 스택에 존재할 경우, 해당 액티비티는 최상단에 올리고 그 위에 존재하던 액티비티는 모두 삭제
        ex> ABCDE -> B call -> AB(기존의 B) 
      3. FLAG_ACTIVITY_FORWARD_RESULT : 호출 결과를 포워딩해서 전달받고 싶을 때 사용
        ex> ABC -> C setResult -> B onActivityResult / B finish -> A onActivityResult
      4. FLAG_ACTIVITY_NEW_TASK : 새로운 Task를 생성하여 액티비티를 추가(단, 기존 Task 중 생성하려는 액티비티와 동일한 affinity를 가지고 있다면 해당 Task에서 실행, FLAG_ACTIVITY_MULTIPLE_TASK와 함께 사용하면 무조건 Task를 새로 생성함)
      5. FLAG_ACTIVITY_REORDER_TO_FRONT : 호출하려는 액티비티가 스택에 존재할 경우 최상위로 올려줌
        ex> ABCDE -> C call -> ABDEC
  • Intent Resolving : 암시적 인텐트의 경우 필요, 인텐트 객체 내의 여러 정보들을 바탕으로 가장 적절한 App을 찾는 과정
  • Intent Filter : Manifest파일에 받을 수 있는 인텐트 종류를 정의한 것 
  • Intent Filter 속성
      1. Action Filter : Intent에 정의된 action 값으로 필터링(정의된 값이 없으면 인텐트 필터와 무관하게 통과)
      2. Category Filter : Intent에 정의된 category 값으로 필터링, 암시적 인텐트는 기본적으로 정의하지 않아도 Intent.CATEGORY_DEFAULT는 자동 부여
      3. Data Filter : Intent내의 data 항목 및 type의 일치 여부로 필터링, 데이터의 주소(URI) 검사하는 부분과 데이터의 유형(MIME type)을 검사하는 부분으로 나뉨
    <data android:mimeType = "video/mpeg" android:scheme = "http"> 
    <data android:mimeType = "audio/*" android:scheme = "http"> 
    
    // mimeType은 위와 같은 형식으로 정의되며, 큰 범주/하위 범주 형식으로 정의. 
    // 하위 범주에는 와일드카드 문자(*)를 사용하여 해당 범주 내의 모든 형식을 허용 가능하다. 
    
    // "http 스키마를 가진 mpeg 형식의 비디오 데이터"를 가진 인텐트를 허용 
    // "http 스키마를 가진 모든 오디오 데이터"를 가진 인텐트를 허용​

 

반응형