포스트

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 라이센스를 따릅니다.