안드로이드 공식문서 중 <활동에서 결과 가져오기> 페이지에 이런 말이있다.
결과를 얻기 위해 활동을 시작할 때, 메모리 부족으로 인해 프로세스와 활동이 소멸될 수 있습니다(특히, 카메라 사용과 같이 메모리를 많이 사용하는 작업의 경우 소멸 확률이 매우 높음).
이것을 그냥 넘어가면 카메라로 사진을 찍은 뒤 제출하면 앱이 종료된다는 CS를 종종 만나게될 수 있다.
처음엔 원인을 몰라 코드를 살펴보고 테스트도 여러번해보았지만 앱이 종료되는 경우를 재현할 수 없었다.
결론은 사용자의 핸드폰이 메모리 부족상태였던 것이다.
때문에 카메라앱에서 MainActivity로 돌아왔지만 MainActivity는 메모리 부족으로 이미 소멸된 상태였기 때문에 재생성되게된다.
이 과정에서 상태저장 처리를 해놓지 않았다면 MainActivity는 적절한 상태를 갖지 못해 앱이 크래쉬가 날 수 있다.
이를 해결하기 위해선 onSaveInstanceState() 함수와 onCreate() 혹은 onRestoreInstanceState() 함수를 이용하면 된다.
companion object{
private const val STATE_USER= "STATE_USER"
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putSerializable(STATE_USER, user)
}
이런식으로 앱이 시스템에 의해 종료되고 재생성될때 유지되어야할 상태를 저장한다.
그 상태를 불러올때는 아래처럼 하면 된다.
override fun onCreate(savedInstanceState: Bundle?){
user = savedInstanceState.getSerializable(STATE_PHOTO_FILE) as? User
}
'안드로이드 앱개발' 카테고리의 다른 글
딥링크 구현시 intentfilter 설정 주의사항 (0) | 2022.04.11 |
---|---|
이미지 피커 라이브러리 <뭉치피커> 개발기 (0) | 2022.03.29 |
딥링크, 앱링크, 디퍼드 딥링크, 다이나믹링크와 광고의 연결 (0) | 2022.03.28 |
안드로이드 라이브러리 만들때 유의사항 (0) | 2021.12.31 |
사내 카페 주문앱 개발기(1): 클린아키텍쳐 (0) | 2021.11.27 |