안드로이드 시스템은 실행중인 앱의 상태를 직접 관리한다.
이는 앱이 독립적이게 될 경우, 메모리를 과도하게 점유하거나 권한을 과도하게 갖는 것을 방지하는 용도이다.
멀티태스킹을 지원하는 안드로이드의 경우 시스템이 계속해서 모니터링할 필요가 있다.
실행한 액티비티 위에 다른 액티비티가 생성되면, 액티비티는 액티비티 스택에 넣어서 보관하게 된다.
즉 이는 한 액티비티가 다른 액티비티의 상태에 영향을 미칠 수 있음을 의미한다.
ex.) 게임 앱을 하던 중 전화가 와서 전화 앱이 최상단에 위치하는 경우
따라서 액티비티는 실행, 중지, 메모리에서 해제되는 여러 과정의 상태 정보를 가지고 있다.
- 실행(Running) : 화면상에 액티비티가 보이는 형태. 액티비티 스택의 최상위에 위치한다.
- 일시 정지(Paused) : 사용자에게 보이긴 하지만, 다른 액티비티에 가려져 있어서 포커스를 받지 못하는 상태. 대화상자 때문에 가려지는 경우에 해당한다.
- 중지(Stopped) : 다른 액티비티에 의해 완전히 가려진 상태.
액티비티가 생성되고 없어질 때까지 상태가 변화하며 각각에 해당하는 메서드가 자동으로 호출된다.
- 새로운 액티비티 : onCreate(), onStart(), onResume() 메서드가 순차적으로 자동으로 호출된 후 액티비티가 실행된다.
- 실행 : 일시 정지됐다면 onPause() 메서드가 호출되고, 다시 돌아오면 onResume() 메서드가 호출된다.
- 중지 : onStop() 메서드가 호출되고, 만일 다시 실행으로 갈 경우에는 onRestart(), onStart(), onResume() 메서드가 자동으로 호출된다.
- 소멸 : onDestroy() 메서드가 호출되면 메모리에서 액티비티가 사라진다.
각 메서드에 대해 살펴보겠다.
- onCreate() : 액티비티가 처음에 만들어졌을 때 호출된다. 보통 화면에 보이는 뷰들의 상태를 설정한다. 이전 상태가 저장되어 있다면 번들 객체를 참조해서 복원이 가능하다. 이 메서드가 호출된 후에는 onStart() 메서드가 호출된다.
- onStart() : 액티비티가 화면에 보이기 전에 호출된다.
- onResume() : 액티비티가 사용자와 상호작용 하기 전에 호출된다.
- onRestart() : 액티비티가 중지된 이후에 호출되는 메서드, 다시 시작하기 바로 전에 호출되고 바로 다음에 onStart() 메서드가 호출된다.
- onPause() : 또 다른 액티비티를 실행하는 경우 호출된다. 데이터를 저장소에 저장하거나 애니메이션 작업을 중지하는 기능을 담당한다. 이 작업이 리턴되기 전까지는 다른 액티비티가 실행되지 않으므로, 빠르게 리턴되어야 한다. 액티비티가 이 상태에 들어가면 시스템은 강제종료할 수 없다.
- onStop() : 액티비티가 사용자에게 보이지 않을 때 호출된다. 소멸되거나 다른 액티비티에 의해 가려졌을 때 호출된다. 액티비티가 이 상태에 들어가면 시스템은 강제종료할 수 없다.
- onDestroy() : 액티비티가 소멸되어 없어지기 전에 호출이 된다. 앱에 의해 종료되거나 시스템이 강제종료할 때 호출된다.
게임과 같은 앱에서 중지되었다가 다시 실행되면 상태를 저장할 수 있어야 한다.
이 때 onPause()와 onResume() 메서드를 사용해서 저장하고 복원할 수 있다.
이외에도 onSaveInstanceState() 메서드로 번들 객체를 이용해 데이터를 저장하면 onCreate() 메서드나 onRestoreInstanceState 메서드로 복원할 수 있다.
프로젝트를 활용해서 생명주기를 간단하게 확인해 보겠다.
메인 액티비티와 메뉴 액티비티 두 가지를 만들어서 확인해 볼 것이다.
해당 소스를 실행해보면 차례대로 토스트 메시지가 출력된다.
그러나 토스트 메시지는 여러번 나타나면 이전 메시지가 안 보일수도 있다.
그러므로 Log를 찍어보는 것으로 해 보겠다.
액티비티가 생성되고 실행될 때 메서드들(onCreate, onStart, onResume)
이 호출되는 것이 확인가능하다.
일시중지 됐을 때엔 onPause와 onStop이 호출되었고,
다시 실행됐을 때 onStart와 onResume이 호출됐다.
(아마 onRestart는 오버라이드 하지 않아서 안나왔지만 onRestart가 onStart이전에 호출됐을 것이다.)
이렇게 시스템에서 자동으로 호출되는 메서드를 콜백 메서드(Callback Method)라고 한다.
생명주기를 살펴보면 결국 다음과 같은 순서로 이루어진다.
onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy |
이 때, 화면이 보이거나 보이지 않을때 항상 호출되는 메서드가 있다.
바로 onResume과 onPause이다. 이 두 개 메서드는 앱이 갑자기 중지되거나 다시 화면에 나타날 때 앱 데이터의 저장과 복원을 할 수 있는 부분이다.
onPause에서 데이터를 저장했다가 onResume에서 데이터를 복원하는 식으로 구현한다면 쉽게 만들 수 있다.
생명주기는 안드로이드에서 중요한 개념이므로 잘 알아두어야 나중에 개발을 할 때 이해를 쉽게할 수 있다.
'안드로이드 > 개념' 카테고리의 다른 글
[Android] Do It! 안드로이드 도전 07. 로그인 화면과 메뉴 화면 전환하기 (0) | 2021.07.31 |
---|---|
[Android] SharedPreferences 사용하기 (0) | 2021.07.31 |
[Android] 태스크 관리 (0) | 2021.07.31 |
[Android] 플래그와 부가 데이터 - feat. Parcelable과 양방향 데이터 바인딩 사용 (0) | 2021.07.31 |
[Android] 인텐트, Intent (0) | 2021.07.31 |