https://developer.android.com/guide/components/activities/activity-lifecycle#oncreate
The activity lifecycle
activity lifecycle의 stages 간에 전환하기 위해 Activity Class는 6가지 콜백으로 구성된 core set의 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()를 제공한다. Activity가 새로운 state에 들어가면 시스템은 각 콜백을 호출하게 되는 구조.
사용자가 Activity을 벗어나기 시작하면 시스템은 Activity를 해체할 메서드를 호출한다. 어떤 경우에는 부분적으로만 해체하기도 하는데, 이때 Activity는 여전히 메모리 안에 남아 있으며(예: 사용자가 다른 앱으로 전환할 경우) foreground로 다시 돌아올 수 있다. 사용자가 해당 Activity로 돌아오는 경우 사용자가 종료한 지점에서 Activity가 다시 시작된다. 단, 몇 가지 예외를 제외하고 앱은 백그라운드에서 실행될 때 Activity를 실행할 수 없다.
Activity의 복잡도에 따라, 모든 lifecycle methods들을 구현할 필요가 없을수도 있지만,각각의 lifecycle methods들을 이해하고, 사용자가 예상한 대로 앱이 동작하도록 필요한 lifecycle methods들을 구현하는 것이 중요!
setContentView()를 호출하는 것과 같은 일부 작업은 Activity lifecycle method 그 자체에 속해 있다. 그러나 종속적인 component의 작업을 구현하는 코드는 해당 component 안에 넣어야 한다. 이를 위해서는 종속적인 component가 lifecycle를 인식하도록 해야 한다.
Activity는 Created state에 쭉 머무르지 않고, onCreate() 메서드가 실행을 완료하면 Started state가 되고, 시스템이 연달아 onStart()와 onResume() 메서드를 호출하게 된다.
활동이 Started state로 전환하면 이 Activity의 lifecylce과 연결된 모든 lifecycle 인식 component는 ON_START 이벤트를 수신하게 됨.
onStart() method가 완료되면 Activity가 Resumed state에 들어가고, 시스템이 onResume() 메서드를 호출함.
Activity가 Resumed state로 전환되면 이 Activity의 lifecycle과 연결된 모든 lifecycle 인식 component(=lifecycle-aware component)는 ON_RESUME 이벤트를 수신한다. 이 Resumend state에서 lifecycle component가 foreground에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화할 수 있음(ex. 카메라 미리보기 시작)
이때부터 만약, interruptive한 이벤트가 발생하면 Activity는 Paused state에 들어가고, 시스템이 onPause() 콜백을 호출한다.
Activity가 Paused state에서 Resumed state로 돌아오면 시스템이 onResume() 메서드를 다시 한번 호출한다. 그렇기에 반드시 onResume()을 구현할 때, onPause() 동안 해제되는 Component를 초기화하고, Activity가 Resumed state로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 한다.
Activity가 Paused state에서 Resumed state로 돌아온다면 시스템은 Activity 인스턴스를 메모리에 남겨두고, 시스템이 onResume()을 호출할 때 이 인스턴스를 다시 호출하는 구조이다. Activity가 완전히 invisible되면 시스템은 onStop()을 호출.
Activity가 Stopped state로 전환하면 이 Activity의 lifecycle과 연결된 모든 lifecycle-aware component는 ON_STOP 이벤트를 수신한다.
onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안, 앱이 필요로 하지 않는 리소스를 해제하거나 조정해야 한다.
또한 onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야 한다.
ex) 데이터를 데이터베이스에 저장할 적절한 시기를 찾지 못했다면 onStop() 상태일 때 저장하면 됨.
Activity가 Stopped state에 들어가면 Activity 객체는 메모리 안에 머무르게 되고 Activity가 다시 시작되면 다시 호출된다.
Activity는 Stopped state에서 다시 시작되어 사용자와 상호작용하거나, 실행을 종료하고 사라지는 로직에서, Activity가 다시 시작되는 부분은 시스템은이 onRestart()를 호출하게 된다. Activity가 실행을 종료하면 시스템은 onDestroy()를 호출한다.
시스템은 다음 중 하나에 해당할 때 이 콜백을 호출함.
Activity가 destroyed state로 전환하면 이 Activity의 lifecycle과 연결된 모든 lifecycle-aware component는 ON_DESTROY 이벤트를 수신한다. 여기서 lifecycle component는 Activity가 destroy되기 전에 필요한 것들을 clean up하는 과정을 거칠 수 있다.
Activity가 종료되는 경우, onDestroy()는 Activity가 수신하는 마지막 lifecycle 콜백이이다. 따라서, onDestroy() 콜백은 이전의 콜백에서 아직 해제되지 않은 모든 리소스(예: onStop())를 해제해야 합니다.
구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 Activity 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출하게 된다.
Navigating between activities
앱은 lifecycle 동안 Activity에 여러 번 들어가고 나올 가능성이 크다.
ex) 사용자가 기기의 뒤로 버튼을 누르는 경우 현재 Activity에서 다른 Activity를 launch하게 된다.
Starting one activity from another
Activity는 보통 특정 시점에서 다른 Activity를 launch해야 하는 경우가 많이 발생한다.
ex) 앱이 현재 화면에서 새로운 화면으로 옮겨갈 때
현재 Activity가 종료되고 새로 launch하려는 Activity에서 result를 받기를 원하는지 여부에 따라 startActivity()나 startActivityForResult() 메서드 중 하나를 사용하여 새 Activity를 launch한다. 물론 두 가지 경우 모두 Intent 객체를 전달함.
val intent = Intent(this, 새롭게 시작할 액티비티명::class.java)
startActivity(intent)
lifecycle 콜백은 분명히 정의된 순서가 있으며 특히 두 개의 Activity가 같은 프로세스(앱) 안에 있으면서 하나가 다른 하나를 시작하는 경우 순서가 더욱 확실하다.
Activity A가 Activity B를 시작할 때 발생하는 작업 순서는 다음과 같다.
이처럼 lifecycle 콜백의 순서는 분명해 예측할 수 있기 때문에 한 Activity에서 다른 Activity으로 전환되는 information을 관리할 수 있는 것이다.