안드로이드의 앱을 구성하는 일명 4대 컴포넌트는 모두 생명주기가 있다. 이 중, 가장 복잡한 생명주기를 가진 컴포넌트가 액티비티다. 액티비티의 생명주기에 대한 글은 수없이 많다. 하지만, 그런 글들을 읽고 액티비티의 생명주기를 이해하더라도, 문제 분석 시 ‘그래서 지금 사용자가 뭘 했길래 이렇게 호출된거야?’라는 생각이 드는 경우가 있다. 그러므로, 여기서는 액티비티 생명주기 소개 대신에 상황 별로 호출되는 액티비티의 생명주기 메소드들을 정리한다.
참고로, 여기서 상황이란 ‘앱 아이콘을 통해 액티비티를 최초 실행 시’ 등 액티비티에게 변화를 주는 액션을 사용자가 하는 때이며, O OS 단말 기준으로 테스트했다.
onCreate() > onStart() > onResume() 순으로 호출되는 경우
- (액티비티 미실행 상태) – 앱아이콘 클릭 – 액티비티 최초 실행
- (최근 앱 목록 표시 중, 액티비티는 미실행 상태) – 액티비티 선택 – 액티비티 실행
onCreate() > onStart() > onResume() > onPause() > onStop() 순으로 호출되는 경우
- (화면 잠김 상태) – ADB 커맨드를 통한 액티비티 실행
onRestart() > onStart() > onResume() 순으로 호출되는 경우
- (액티비티 foreground 상태에서 화면 잠김 상태) – 화면 잠금 해제(홈이나 전원 버튼, 필요하다면 비밀번호 입력 등) – 액티비티 실행
- (액티비티를 실행한 적이 있으며 숨겨져 있는 상태) – 액티비티 실행(앱 아이콘 클릭 등) – 액티비티 실행
onPause()만 호출되는 경우
- (액티비티 foreground 상태) – 다른 액티비티 실행
onPause() > onStop() 순으로 호출되는 경우
- (액티비티 foreground 상태) – 전원 버튼 누르기 – 화면 잠금
- (액티비티 foreground 상태) – 홈 버튼 누르기 – 런쳐 홈으로 이동
onPause() > onStop() > onDestroy() 순으로 호출되는 경우
- (액티비티 foreground 상태) – 뒤로가기 버튼 눌러 액티비티 나가기
onDestroy()만 호출되는 경우
- (최근 앱 목록 표시 중) – 액티비티 제거하기(밀어내기나 ‘X’ 버튼)
그 밖에
- 액티비티를 실행한 적이 있다는 말의 의미는, 액티비티 컴포넌트가 소멸되지 않고 메모리에 상주하고 있어 재사용될 수 있다는 의미다.
- 최근 목록 앱에 액티비티가 표시되더라도 액티비티는 미실행 상태일 수 있다. 최근 목록 앱은 파일 형태로 저장되어 단말 재부팅 후에도 히스토리 관리를 위해 유지되기 때문이다.
- 액티비티 위에 다이얼로그를 표시하는 경우는, 생명주기 변화가 없다. 액티비티 위에 액티비티가 뜨는 경우에만, 변화가 있다.
- 액티비티 컴포넌트의 onDestroy() 메소드가 호출되지 않고도, 자원 부족으로 인해 컴포넌트가 사라지기도 한다.
참고