본문 바로가기

JAVA/Android

[JAVA][Android] 스택에 2개 이상의 앱이 쌓여 발생한 이슈와 대안, 스택 내용 확인하는 ADB 명령어

이슈 내용
 : A앱 호출 -> B앱 호출 -> C앱 호출 -> A앱 재호출 -> B앱 재호출 후
   B앱에서 A앱으로 setResult 통해 연동함.
   A앱의 onActivityResult에 resultCode가 0(RESULT_CANCELED)로 리턴 됨
   단순히 B앱 -> A앱으로 호출 시 발생하지 않으나 위의 케이스에서만 발생
   A앱의 launchMode는 singleTop으로 설정되어 있음

이슈 원인
 : 위의 케이스와 같이 앱이 스택에 남아있는 상태에서 재호출 할 경우
   스택에 앱이 2개 남아있어, result data 전달 시 충돌이 발생함
   스택의 경우 A앱의 taskAffinity 속성으로 인해 A앱이 기존 태스크가 아닌 
   별도의 태스크로 관리되어 발생한 문제

이슈 대안
 : taskAffinity 속성과 launchMode를 삭제한 뒤 A앱을 호출하는 시점에 
   intent에 FLAG_ACTIVITY_CLEAR_TOP 플래그 속성을 지정함으로써
   쌓여있는 모든 액티비티들이 종료되고 새로운 액티비티가 호출되도록 함

 

공식 참고문서

https://developer.android.com/guide/components/activities/tasks-and-back-stack?hl=ko 

 

작업 및 백 스택 이해  |  Android 개발자  |  Android Developers

일반적으로 앱에는 여러 활동이 포함됩니다. 각 활동은 사용자가 실행할 수 있는 특정 종류의 작업을 중심으로 설계되어야 하며 다른 활동을 시작할 수 있어야 합니다. 예를 들어 이메일 앱에는

developer.android.com

 

FLAG_ACTIVITY_CLEAR_TOP 의 설명

시작 중인 활동이 현재 작업에서 이미 실행 중이면 활동의 새 인스턴스가 실행되는 대신 작업의 맨 위에 있는 다른 모든 활동이 제거되고 이 인텐트가 onNewIntent()를 통해 활동(이제 맨 위에 있음)의 다시 시작된 인스턴스로 전달됩니다.이 동작을 발생시키는 launchMode 속성 값은 없습니다.
FLAG_ACTIVITY_CLEAR_TOP은 FLAG_ACTIVITY_NEW_TASK와 함께 가장 자주 사용됩니다. 이러한 플래그를 함께 사용하면 또 다른 작업에 있는 기존 활동을 찾아 인텐트에 응답할 수 있는 위치에 활동을 넣을 수 있습니다.

 

Command 창에서 현재 스택에 쌓인 액티비티를 확인하는 명령어