Intent StartActivity() 호출 직후 onActivityResult() 호출 이슈
2022. 1. 8. 21:15ㆍAndroid/개발 CASE
반응형
[이슈] startActivityForResult() 호출 직후 onActivityResult()가 호출됨
[원인] Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 지정 후 startActivity()를 호출해서 onActivityResult()가 바로 실행된 것이었음
[해결] Intent에 해당 Flag 지정하지 않고 실행
[참고]
- Task란? App에서 실행되는 Activity를 보관하고, 관리하는 스택
- Flag란? Task내 액티비티 제어 방식
- Flag 사용법
- AndroidManifest에서 원하는 Activity의 launchMode 속성을 사용해 적용(4가지 모드만 지원, 특수 경우 제외하고, 일반적으로 standard/singleTop만 사용)
- standard : 스택 중 어느 곳에나 위치 가능하며 여러개의 인스턴스가 생성(기본적으로 설정되는 값)
- singleTop : standard 방식 + 호출 activity가 최상위 activity와 동일한 경우 최상위 activity 재사용(기존 최상위 activity pop)
- 시나리오 : Activity A - sigleTop - singleTask : 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능(타 Task에서 동일 activity 사용 불가)
- 시나리오 : Activity C - singleTask - singleInstance : 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능, Task 내에 하나만 생성되므로 호출하게 되면 새로운 Task가 생성됨(하나의 Task에 하나의 Activity만 존재할 수 있음-->?? 그럼 sigleInstance에서 standard 호출해도 새로운 Task가 생긴다는건가..?)
- 시나리오 : Activity A, B, C - sigleInstance
- standard : 스택 중 어느 곳에나 위치 가능하며 여러개의 인스턴스가 생성(기본적으로 설정되는 값)
- intent.addFlags() 호출해 원하는 Flag 지정
- FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET : Task가 리셋될 때 플래그가 사용된 액티비티부터 위의 액티비티가 모두 삭제
ex> ABCDE -> B call -> AB(새로운 B) - FLAG_ACTIVITY_CLEAR_TOP : 호출하는 Activity가 스택에 존재할 경우, 해당 액티비티는 최상단에 올리고 그 위에 존재하던 액티비티는 모두 삭제
ex> ABCDE -> B call -> AB(기존의 B) - FLAG_ACTIVITY_FORWARD_RESULT : 호출 결과를 포워딩해서 전달받고 싶을 때 사용
ex> ABC -> C setResult -> B onActivityResult / B finish -> A onActivityResult - FLAG_ACTIVITY_NEW_TASK : 새로운 Task를 생성하여 액티비티를 추가(단, 기존 Task 중 생성하려는 액티비티와 동일한 affinity를 가지고 있다면 해당 Task에서 실행, FLAG_ACTIVITY_MULTIPLE_TASK와 함께 사용하면 무조건 Task를 새로 생성함)
- FLAG_ACTIVITY_REORDER_TO_FRONT : 호출하려는 액티비티가 스택에 존재할 경우 최상위로 올려줌
ex> ABCDE -> C call -> ABDEC
- FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET : Task가 리셋될 때 플래그가 사용된 액티비티부터 위의 액티비티가 모두 삭제
- AndroidManifest에서 원하는 Activity의 launchMode 속성을 사용해 적용(4가지 모드만 지원, 특수 경우 제외하고, 일반적으로 standard/singleTop만 사용)
- Intent Resolving : 암시적 인텐트의 경우 필요, 인텐트 객체 내의 여러 정보들을 바탕으로 가장 적절한 App을 찾는 과정
- Intent Filter : Manifest파일에 받을 수 있는 인텐트 종류를 정의한 것
- Intent Filter 속성
- Action Filter : Intent에 정의된 action 값으로 필터링(정의된 값이 없으면 인텐트 필터와 무관하게 통과)
- Category Filter : Intent에 정의된 category 값으로 필터링, 암시적 인텐트는 기본적으로 정의하지 않아도 Intent.CATEGORY_DEFAULT는 자동 부여
- 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 스키마를 가진 모든 오디오 데이터"를 가진 인텐트를 허용
- Action Filter : Intent에 정의된 action 값으로 필터링(정의된 값이 없으면 인텐트 필터와 무관하게 통과)
반응형
'Android > 개발 CASE' 카테고리의 다른 글
Fragment startActivityForResult() requestCode (0) | 2022.01.10 |
---|---|
[WIP]RecyclerView Item Layout MATCH_PARENT 적용안됨 (0) | 2022.01.10 |
[ERROR/EXCEPTION] Dialog IllegalStateException (0) | 2022.01.08 |
Dialog vs DialogFragment (0) | 2022.01.08 |
권한 변경 시 생명주기 (0) | 2022.01.06 |