Activity의 모든 인스턴스는 생명주기를 갖는다.
생명주기 동안 액티비티는 네 가지 상태로 상호 전환된다.
- 실행 재개(resumed)
- 액티비티가 메모리에 있고 화면에서 전체를 볼 수 있고 포그라운드에 있는 상태
- 사용자와 현재 상호작용하고 있는 액티비티의 상태
- 전체 시스템에 걸쳐 하나의 액티비티만 될 수 있는 상태
- 일시 중지(paused)
- 액티비티가 포그라운드에서 작동하지 않지만, 인스턴스의 뷰 전체 혹 일부를 화면에서 볼 수 있음
- 메모리에 있음
- 중단(stopped)
- 액티비티 인스턴스가 메모리에 있지만, 뷰는 화면에서 볼 수 없음
- 액티비티가 처음 시작될 때 거쳐가는 상태
- 액티비티 인스턴스의 뷰가 화면에서 완전히 가려졌을 때 언제든 다시 진입하는 상태
- 존재하지 않음(nonexistent)
- 액티비티가 아직 런칭되지 않았거나 소멸된 상태
- 메모리에 존재하지 않음, 뷰도 없음
각 상태로 전환이 발생할 때 액티비티에 상태 변경을 알려주는 Actvitiy 함수들이 있으며, 이 함수들은 안드로이드가 자동 호출한다.
private const val TAG = "MainActivity"
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate(Bundle?) called")
setContentView(R.layout.activity_main)
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart() called")
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume() called")
}
override fun onPause() {
super.onPause()
Log.d(TAG, "onPause() called")
}
override fun onStop() {
super.onStop()
Log.d(TAG, "onStop() called")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy() called")
}
}
위 와 같이 생명주기 callback method를 오버라이드해 찍어서 어플을 실행시킨 후
홈키를 누르고 다시 어플을 키고.. 백키를 누르고 다시 어플을 켜보면 어플이 어떻게 돌아가는지 볼 수 있다.
홈 버튼을 누르고 다시 실행시키면onPause
-> onStop
-> onStart
-> onResume
이 실행된다.
즉, 위 상태 분류에 따르면 중단상태가 된다.
백 버튼을 누르고 다시 실행시키면onPause
-> onStop
-> onDestroy
-> onCreate
-> onStart
-> onResume
이 실행된다.
즉, 존재하지 않는 상태까지 갔다 온다.
백 버튼을 누른다는 의미는 해당 액티비티를 끝냈다는 의미가 된다.
안드로이드 OS에 나는 액티비티를 다 사용했으니 필요없다라고 하는 셈이다.
그러면 안드로이드 OS는 해당 액티비티를 소멸시키고 메모리에서 모든 흔적을 지운다.
이것이 제한된 리소스를 절약하는 안드로이드의 방식이다.
사용자가 장치를 회전할 때 안드로이드 OS는 액티비티를 소멸시킨다.
이런 문제는 ViewModel에 UI data를 저장해 UI 상태가 유실되는 결함을 해결할 수 있다.