Android Fragment 생명주기와 savedInstanceState 삽질기
Android Fragment 생명주기와 savedInstanceState 삽질기
문제 상황
고등학교 때 학교 학우들을 위한 편의 앱 “동천 알리미”를 만들었다. 시간표, 급식, 공지사항 등을 볼 수 있는 앱이었다.
화면 구성은 이랬다:
- FrameLayout에 4개의 Fragment를 올려놓고
- Bottom Navigation Bar로 show/hide 해서 전환
그런데 이상한 버그가 생겼다. 잠깐 다른 앱을 켰다가 다시 돌아오면 hide 해둬던 Fragment들이 전부 show 상태로 바뀌어 있었다.
[이미지 필요] Android Activity/Fragment 생명주기 다이어그램
디버깅 과정
2주 동안 삽질했다.
- 코드를 한 줄 한 줄 뜯어봤는데 이상이 없었다
- FragmentManager 클래스 개발자가 버그를 낸 건가 싶었다
- 영어, 중국어, 일본어 문서까지 번역기 돌려가며 찾아봤다
원인 발견
결국 Android 개발 문서에서 답을 찾았다.
“일시적으로 앱에서 다른 앱으로 전환했다가 다시 앱으로 돌아왔을 때 시스템은 애플리케이션의 프로세스를 소멸시킬 수 있습니다.”
savedInstanceState 때문이었다.
메모리가 부족하면 시스템이 백그라운드 앱의 프로세스를 죽일 수 있다. 이때 Fragment의 상태가 savedInstanceState에 저장되는데, 내가 show/hide 상태를 직접 관리하는 로직이 이 과정에서 초기화된 거다.
해결
Fragment의 상태를 savedInstanceState에 저장하고 복원하는 로직을 추가했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("currentFragment", currentFragmentIndex);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
currentFragmentIndex = savedInstanceState.getInt("currentFragment", 0);
// 해당 Fragment만 show하고 나머지는 hide
}
}
배운 점
- 문제 해결을 위해 고군분투했던 2주가 경험과 능력치가 됐다
- Android 생명주기를 제대로 이해하지 않으면 이런 버그가 생긴다
- “내 코드는 문제없어”라고 생각하기 전에 플랫폼의 동작 방식을 먼저 의심해야 한다
- 공식 문서가 결국 답이다
고등학교 시절 “동천 알리미” 앱 개발 중 경험한 내용 정리. (플레이스토어 출시 및 학생회 홍보, 실사용자 확보)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.