좀비 같은 Activity 처리하기, finish()와 finishAActivity()의 차이
2025. 3. 10. 16:56ㆍAndroid/Android 기초
728x90
반응형
회사 앱에서 Crash가 발생하였다.
로그를 확인하여 예상 시나리오로 재현을 했더니 분명 Finish 시켰던 Activity가 다시 나타나며 발생한 Crash.
그럼 Finish가 정확하게 된게 아닌건가?
<재현 상황>
AActivity 호출 -> AActivity finish() -> CActivity 호출 -> 화면꺼짐(sleep)
-> BActivity 호출(push 알람을 통한) -> BActivity finish() -> AActivity 호출
-> AActivity finish() -> BActivity 부활(좀비)
아니 Finish를 시키면 결국 Activity는 죽어야 하는거 아닐까?
✔ finish() 후에도 Activity가 다시 나타나는 이유
Activity가 백스택에서 제거되지 않고 남아 있음
- finish()는 현재 Activity만 종료할 뿐, 백스택의 다른 Activity에는 영향을 주지 않습니다.
- 즉, 만약 BActivity 위에 AActivity가 있다가 AActivity가 종료되면, 이전 Activity(BActivity)가 다시 나타날 수 있음.
해결 방법:
→ finish()를 호출하기 전에 이전 Activity까지 모두 제거하는 방식으로 해결할 수 있음.
finishAffinity() // 현재 Task 내의 모든 Activity 종료
✔ 그럼 finishAActivity()는 무엇이 다른걸까?
finish는 다른 Activity는 그대로 유지되면서 현재의 Activity만 종료된다.
뒤로가기와 같은 효과를 생각하면 된다.
반면 finishAActivity()는 현재 Task에 속한 모든 Activity를 종료시킨다.
특정 Activity에서 실행하면 그 Task에 있는 모든 Activity가 종료된다.
따라서 앱을 완전히 종료하는 효과를 내고 싶을 때 사용되는 기능이다.
현재 나의 이슈는 죽었던 화면이 특정 화면을 불러오면서 다시 나타났다.
BActivity를 finish 하라는 명령은 주었지만, AActivity가 떠오르며 다시 BActivity의 backstack이 돌아온 것이다.
그래서 AActivity의 backstack까지 지워주기 위해 finishAActivity()라는 명령어를 사용해야 한다.
728x90
반응형
'Android > Android 기초' 카테고리의 다른 글
[Android] 왜 Log.d() 대신 Timber를 써야 할까? (0) | 2025.03.26 |
---|---|
android:exported 속성 필수 이유 (Android 12 대응) (0) | 2025.03.24 |
안드로이드 모듈 간 리소스 충돌 방지: 리소스 ID와 모듈 의존성 (0) | 2025.03.05 |
[Android/Gradle]Gradle에서 APK 생성 타입 설정하기 (0) | 2023.02.24 |
[Android/Basic]BaseActivity (0) | 2023.02.24 |