Developing Myself Everyday
article thumbnail

사진: UnsplashFrancisco De Legarreta C.

 

 

이번 게시글에서는 앱을 운영하면서 발생한 문제와 이를 대처하는 방법을 알아보고자 합니다.


 

 

문제 상황


유지 보수를 하던 중, 앱의 초기 Splash 로딩이 계속해서 반복된다는 오류를 받았습니다. 

 

앱에서는 메인 액티비티에서 Splash 액티비티를 띄우고, Splash 액티비티에서 권한 체크를 한 다음 이상이 없으면 메인 액티비티로 돌아오는 구조로 설계가 되어 있었습니다.

 

문제를 계속 파악하던 중 어떠한 이유로 계속해서 Splash 액티비티가 실행된다는 사실을 알게 되었고, 이는 Main 액티비티에 `onCreate()`에서 실행하는 Splash 액티비티로 이동을 하는 메서드 때문이였습니다.

 

 

onCreate()의 반복 실행

다만, 이는 우리가 알고있는 기본적인 상식과는 너무나도 다른 작동입니다. 우리는 onCreate()는 액티비티의 라이프 사이클 동안 단 한번만 실행된다고 알고 있습니다. 

 

그렇기 때문에 메인 액티비티 자체가 계속해서 재성된다고 파악했고 그 이유를 찾기 시작했습니다.

 

 

 

원인


원인은 바로 사용자가 설정한 개발자 옵션 중 `활동 유지 안함` 옵션을 켰기 때문이였습니다.

 

활동 유지 안함 옵션

활동 유지 안함을 활성화하면 액티비티는 기본 뷰에서 벗어나자마자, 바로 소멸되는 기능입니다. 

 

일반적으로 A 액티비티에서 B 액티비티를 띄울 때, A 액티비티가 `onStop()`되는 반면에 해당 옵션을 키면 `onDestory`가 되고, 다시 A 액티비티로 돌아오면 처음부터 라이프 사이클을 진행하게 됩니다.

 

이는 우리가 생각하는 일반적인 액티비티의 라이프사이클과는 너무나도 다른 부작용을 일으킬 수 있습니다. 

 

저 또한 당연히 onCreate()는 단 한번만 실행될 것이라 생각을 했고, 해당 기능을 구현한 것이였지만 해당 옵션 때문에 말도안되는 버그가 발생했습니다.

 

 

 

해결방안


크게 개발자 옵션을 대처할 수 있는 방법은 2가지가 있다고 생각합니다.

 

 

1. 개발자 옵션에 대응하는 로직 추가

만약 활동 유지 안함같은 개발자 옵션이 설정되어 있다면, 이에 대응하는 로직을 추가하면 됩니다. 

 

다만, 이는 현실적으로는 불가능한 부분이 많다고 생각합니다. 개발자 옵션 자체가 너무나도 많고, 개발자들이 이를 모두 인지할 수도 없기에 첫번째 방법은 어렵다고 생각합니다.

 

그래도 대처를 한다면, 활동 유지 안함 옵션의 경우에는 우리가 구성 변경에 대처하는 방식들을 그대로 사용하면 되겠습니다.

  1. ViewModel 사용
  2. SavedStateHandle 사용

 

2. 개발자 옵션 체크하여 사용하지 못하게 제한

이 방법이 가장 현실적이고, 대부분의 앱들에서 만약 개발자 옵션을 대응한다면 사용하고 있는 방법이라고 생각합니다.

 

ContentResolver를 활용하면 시스템 설정 값을 읽어올 수 있고, 이를 통해서 해당 설정이 켜져 있는 경우에 대처를 할 수 있습니다. 

 

저의 경우에는 아래와 같은 클래스를 따로 만들어서 `활동 유지 안함` 옵션에 대처하고 있습니다.

@Singleton
internal class DeveloperOptionsCheckerImpl @Inject constructor(
    @ApplicationContext private val context: Context,
) : DeveloperOptionsChecker {

    override fun isDontKeepActivitiesEnabled(): Boolean {
       return try {
          Settings.Global.getInt(
             context.contentResolver,
             Settings.Global.ALWAYS_FINISH_ACTIVITIES,
             0,
          ) == 1
       } catch (e: Exception) {
          false
       }
    }
}

 

 

 

결론


안드로이드 디바이스의 경우에는 아무대로 사용자들이 마음대로 커스텀할 수 있는 부분이 많다보니, 생각지도 못한 사이트 이펙트들이 많이 나오는것 같습니다. 

 

`활동 유지 안함` 옵션의 경우에는 여러 유튜브나 블로그에서 배터리를 아낄 수 있다는 식으로 이야기를 하기도 하다 보니, 이 게시글을 읽으신 분들이라면 한번씩 대응해보시는 것을 권장드립니다.

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!