티스토리 뷰

728x90

일반적인 다른 폰과 다르게 샤오미 MI Ui를 사용하는 폰은 개발 시 Activity의 lifecycle이 조금 다르게 잡힌다.

 

1. 앱의 비활성화 시에 onPause, onStop이 호출되고

2. 다른 앱을 사용 시 process termination되어 버린다. 일반적인 디바이스에서는 onPause, onStop이 호출되고 복귀 시에 onRestart, onResume이 호출된다.

3. 다시 백그라운드의 앱을 실행해서 다시 앱을 활성화시키면 onCreate이 호출되면서 새로운 process가 생성된다.

  3-1 이런 이상 증상은 아래 스크린 샷처럼 com.miui.hom에서 PeriodicCleaner가 다른앱으로 스위칭 될 경우 앱을 강제로 죽이는 것으로 보인다. 다른 상용앱에서는 이런 증상이 없는 것으로 보아 play store 아닌 usb로 설치된 경우에 이런 현상이 생기는 것으로 보인다.

 

 

https://xiaomi.eu/community/threads/periodiccleaner-killing-processes-randomly.67838/

 

4. 일반적으로 하나의 스크린은 하나의 viewmodel을 독립적으로 관리하는 것이 바람직하고 process termination에도 상태 변화에 적응할 수 있다.

  4-1 어떤 앱들은 하나의 스크린에 추가적인 경로들(자식페이지) 이 존재하는 경우가 있는데 이 경우는 하나의 viewmodel을 여러 개의 세부 페이지에서 공유하게 된다. 이 경우 세부 페이지에서 다른 앱의 전환이 발생하고 다시 복귀한 경우 초기화 작업이 실행되지 않기 때문에 앱이 죽을 확율이 높다.

  4-2 paging3을 사용하여 페이징하는 경우는 snapshot을 공유하는 경우가 많은데 세부페이지에서 복귀하는 경우 snapshot을 복구할 수가 없다. 이럴 경우는 그냥 해당 스크린의 초기화 가능한 스크린 메인으로 포워딩하는 것으로 임시처리 가능하다.

 

        composable(
            route = Screen.MemoDetail.route,
        ) {
            val memoViewModel = hiltViewModel<MemoViewModel>(
                viewModelStoreOwner = viewModelStoreOwner
            )

            Log.i(
                "PHILIP",
                "[memoNavGraph] TaskScreen called"
            )

            // activity가 destroy 되고 다시 생성된 예외적 경우는 List 화면으로 forwarding
            if (memoViewModel.firstFetch) {
                Log.i("PHILIP", "[MemoNavGraph] memoViewModel value ${memoViewModel.toString()}")
                navHostController.navigate(Screen.MemoList.route)
            } else {

                TaskScreen(
                    memoViewModel = memoViewModel,
                    toListScreen = toListScreen
                )
            }

        }

 

5. 결론은 개발할 때 테스트용으로 샤오미 폰을 사용하지 않는 걸로

728x90
댓글