일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- exoplayer cache
- list map
- llm
- ktor api call
- android
- android ktor
- FastAPI
- AWS EC2
- ExoPlayer
- ansi2html
- getChangePayload
- map
- build with ai
- doc2vec
- ChatGPT
- video caching
- Python
- DiffUtil.ItemCallback
- 독서
- android exoplayer
- 유튜브
- ListAdapter DiffUtil
- ListAdapter
- 시행착오
- ktor client
- kotlin collection
- android custom view
- kotlin list
- 스피너
- 안드로이드
- Today
- Total
버튼 수집상
[안드로이드] Invisible된 액티비티가 onStop을 타지 않는 이슈 본문
themes.xml 파일에서 windowIsTranslucent=true 옵션을 지우고
앱을 다시 설치하니까 해결됐다.
관련 스택오버플로우 번역
Q
onStop()이 호출되지 않는 이슈?
액티비티에 android:theme="@style/Theme.AppCompat.Light.NoActionBar 을 적용하고 다음 액티비티로 넘어가면 onPause()와 onStop()이 호출됩니다.
그런데 아래 커스텀 Theme을 사용하면 onPause()는 호출되는데 onStop()은 호출되지 않습니다.
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="android:windowIsTranslucent">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
액티비티 theme과 관련된 이벤트가 있는 건가요?
A1
액티비티가 투명translucent 처리 되어있으므로,
첫번째 액티비티의 onStop()은 호출되지 않을 것입니다.
다이얼로그 띄울 때랑 비슷한 경우입니다:
액티비티 상태가 포그라운드가 아니기 때문에 onPause()는 타지만
(다이얼로그가 화면의 일부만 가려서) 유저에게는 아직 액티비티가 보이기 때문에 onStop()을 타지는 않습니다.
A2 (채택된 답변)
<item name="android:windowIsTranslucent">true</item> 옵션은 액티비티 라이프사이클에 아무런 영향을 주지 않습니다.
뭐가 문제였는지는 모르겠지만 안드로이드 스튜디오를 재시작하니 이슈가 해결됐습니다.
관련 티스토리 글
답변들이 전부 제각각이라 간단한 샘플 코드를 작성해봤다.
액티비티에 적용시킬 커스텀 theme.
<style name="transparent" parent="Theme.AppCompat">
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="not_transparent" parent="Theme.AppCompat">
<item name="android:windowIsTranslucent">false</item>
</style>
AndroidManifest.xml에서 두 액티비티에 각각 다른 theme을 적용.
액티비티1은 투명, 액티비티2는 불투명으로 적용시킨다.
<activity
android:name=".Activity1"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/transparent">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Activity2"
android:theme="@style/not_transparent"/>
두 액티비티 사이를 오가는 간단한 화면을 만든 뒤 생명주기마다 로그를 찍는다.
액티비티1 -> 액티비티2 로 화면이 바뀔 땐
액티비티1의 onStop()이 잘 호출되지만,
액티비티2 -> 액티비티1로 다시 화면이 바뀔땐
액티비티2의 onStop()이 안 들어오는 것을 볼 수 있다.
아래쪽 로그를 보면 액티비티2로 진입한 상태에서 액티비티2 onStop()을 호출하고 있는 것을 볼 수 있다.
투명 액티비티는 액티비티 라이프사이클에 영향을 주는 것이 맞는 것 같다.
'TIL - 안드로이드' 카테고리의 다른 글
[안드로이드] 스피너 커스텀UI 만들기 (두 줄 리스트 스피너) (0) | 2023.05.02 |
---|---|
[안드로이드] 가변적인 json 키를 동일한 클래스로 파싱하기 (0) | 2023.04.18 |
[안드로이드] 액티비티 미리 로드하기 (0) | 2023.01.05 |
[안드로이드] Spinner 아이템 선택 안 하고도 onItemSelectedListener 를 타는 문제 (0) | 2022.12.08 |
[안드로이드] 카카오 로그인 SDK - 앱 로그인 실패시 계정 로그인으로 우회 (0) | 2022.11.23 |