Activity는 사용자나 시스템의 요청에 따라 다양한 상태로 전환될 수 있습니다. 앱을 실행하는 도중에 잠깐 다른 앱으로 이동, 다른 Activity로 이동, 앱을 종료하는 등의 전환이 발생했을 때 Activity에서 이를 알아차리고 적절한 처리를 하도록 콜백을 구현할 수 있습니다.
Android 공식 문서에서는 Lifecycle 콜백을 통해 아래 문제를 해결할 수 있다고 예시를 들어 설명합니다.
- 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때 비정상 종료되는 문제
- 사용자가 앱을 활발하게 사용하지 않는 경우 귀중한 시스템 리소스가 소비되는 문제
- 사용자가 앱에서 나갔다가 나중에 돌아왔을 때 사용자의 진행 상태가 저장되지 않는 문제
- 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제
Lifecycle
https://developer.android.com/guide/components/activities/activity-lifecycle
개발자는 Activity를 직접 만들지 않습니다. Intent를 통해 Android System에 해당 Activity를 띄어달라고 요청할 뿐입니다. 즉 Activity는 Android System에 의해서 관리됩니다.
위의 그림을 통해 Activity가 언제 생성되고, 멈추고, 삭제되는지 알 수 있습니다. onCreate, onStart 등의 콜백 함수를 구현해서 각 상태로 전환되었을 때 처리를 해줄 수 있습니다.
Activity가 처음 실행되면 onCreate -> onStart -> onResume 순으로 호출됩니다.
이후 activity를 종료하면 onPause -> onStop -> onDestroy순으로 호출되고 삭제됩니다.
보시면 콜백 함수들이 2개씩 짝지어져 있습니다.
Activity 생성/삭제 | onCreate | onDestroy |
Activity 표시/숨김 | onStart | onStop |
Activity 포커스 | onResume | onPause |
Activity 생성 삭제
Activity가 최초에 생성될 때 onCreate가 호출됩니다. 반대로 삭제될 때는 onDestroy가 호출되겠죠.
Activity 생성과 삭제는 Lifecycle동안 각각 한 번만 이루어집니다. Activity를 초기화하는 로직을 onCreate에 넣고, 정리가 필요한 리소스들을 정리하는 로직을 onDestory에 넣으면 좋겠죠?
Activity 표시/숨김
Activity가 표시되기 전에 onStart, 표시되지 않기 전에 onStop이 호출됩니다. 그러므로 onStart에서는 UI관련 로직을 초기화하고, onStop에서는 애니메이션이나 UI로직을 일시정지하는 코드를 넣을 수 있습니다.
Activity 포커스
Activity가 포커스되면 onResume, 반대로 포커스를 잃게되면 onPause이 호출됩니다. 포커스를 얻은 상태는 사용자에게 보이고, 상호작용할 수 있는 상태를 의미합니다.
참고
https://developer.android.com/guide/components/activities/activity-lifecycle