티스토리 뷰
일반적인 다른 폰과 다르게 샤오미 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. 결론은 개발할 때 테스트용으로 샤오미 폰을 사용하지 않는 걸로
'기록' 카테고리의 다른 글
VS Code React, Next 에서 double quotes 사용하기 (0) | 2024.03.26 |
---|---|
Kotlin: resilience4j circuit breaker fallback (0) | 2024.03.15 |
[Android] LazyColumn이 아닌 swipeToDismiss로 Carousal 구현 (0) | 2023.05.05 |
코딩 면접에 대해서 (0) | 2023.04.02 |
AWS : Beanstalk ALB access log 생성 문제 (0) | 2023.03.28 |
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
- 로그인
- crud
- mapping
- Security
- one-to-many
- login
- Rest
- XML
- 설정하기
- jsp
- WebMvc
- Spring Security
- Many-To-Many
- MYSQL
- Validation
- 스프링
- Angular
- form
- 외부파일
- RestTemplate
- 스프링부트
- 자바
- one-to-one
- Spring
- spring boot
- 매핑
- 설정
- 상속
- 하이버네이트
- hibernate