평범한 개발자 행복한 가족, 패밀리그램

개발/안드로이드

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

패밀리그램 2018. 5. 10. 22:25

앱을 만들 때 코치마크와 같은 것을 표현 할 때 오래 전에 투명 Activity를 종종 사용했었다. windowIsTranslucent 을 true로 된 테마를 사용하는 방법인데, 요즘에도 종종 푸쉬 받았을 때 Push service에서 팝업처럼 보이기 위해 사용되곤 한다.  ( 다이얼로그 같은 화면을 표현 할 때 많이 사용되긴 한다 )


Android API 27 에서 해당 테마의 Activity를 사용 할 때 orientation이 설정되어 있으면 풀스크린 모드일 때 아래와 같은 에러를 만나게 된다


java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation


사실 투명속성의 Activity는 부모 Activity orientation에 영향을 받는다. 그렇기 때문에 부모 Activity는 onResume과 onPause도 호출되지 않는다.


위 에러는 manifest에 orientation 속성만 제거해주면 사라진다.


투명 Activity라도 LifecycleObserver는 동작한다

Android Architecture Library 의 LifeCycleOwner와 Observer는 onStop, onPause와 onStart, onResume이 정상적으로 호출되니 주의하자. 


만약 Google IAP Service를 사용을 ViewModel에서 구현했다고 가정할 때, LifecycleObserver를 사용하여 Lifecycle event를 ViewModel에서 처리하면 사고가 일어날 가능성이 있다. 


Google Billing AIDL를 통해 호출되는 Google결제 팝업은 투명 Activity 여서 사실상 onStart와 onStop이 호출되지 않는데, Lifecycle Observer는 해당 이벤트를 받게된다. 


Service bind는 onStart와 onStop 생명주기에 하는것이 맞기 때문에 unbind되지 말아야 할 Google Billing Service가 unbind되어 결제 결과를 받지 못하는 참사를 불러올 수 있다. 


결론

API 27에서 Translucent Activity는 Full screen mode 때문에 orientation설정에 주의를 해야한다.

Translucent Activity라 할지라도 LifecycleOwner에 등록된 Observer들에겐 onStart, onStop, onResume, onPause 이벤트를 전달해준다.



반응형