버튼 수집상

[안드로이드] Invisible된 액티비티가 onStop을 타지 않는 이슈 본문

TIL - 안드로이드

[안드로이드] Invisible된 액티비티가 onStop을 타지 않는 이슈

cocokaribou 2023. 2. 22. 15:25

themes.xml 파일에서 windowIsTranslucent=true 옵션을 지우고
앱을 다시 설치하니까 해결됐다.

 

 

관련 스택오버플로우 번역

 

onStop() does not gets called?

I'm trying to get logs for Activity Lifecycle. And I'm facing some weird issue here. When I use activity's theme as android:theme="@style/Theme.AppCompat.Light.NoActionBar and go to next acitivty.

stackoverflow.com

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> 옵션은 액티비티 라이프사이클에 아무런 영향을 주지 않습니다.

뭐가 문제였는지는 모르겠지만 안드로이드 스튜디오를 재시작하니 이슈가 해결됐습니다.

 

 

관련 티스토리 글

 

안드로이드 API 27 풀스크린 모드 ( Full screen mode ) 주의 사항

앱을 만들 때 코치마크와 같은 것을 표현 할 때 오래 전에 투명 Activity를 종종 사용했었다. windowIsTranslucent 을 true로 된 테마를 사용하는 방법인데, 요즘에도 종종 푸쉬 받았을 때 Push service에서 팝

family-gram.tistory.com

 

 

답변들이 전부 제각각이라 간단한 샘플 코드를 작성해봤다.

 

액티비티에 적용시킬 커스텀 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()을 호출하고 있는 것을 볼 수 있다.

 

 

투명 액티비티는 액티비티 라이프사이클에 영향을 주는 것이 맞는 것 같다.

728x90