Activity Lifecycle
1. Lifecycle
- Lifecycle 함수 : 시스템에서 액티비티의 라이프사이클을 관리하면서 자동 호출되는 함수
- 활성상태 : 액티비티의 화면이 출력되고 있고 유저가 이벤트를 발생 시킬 수 있는 상태, 위 그림에서 보라색 박스
- 일시정지상태 : 액티비티의 화면이 출력되고 있지만 유저가 이벤트를 발생 시킬 수 없는 상태, 위 그림에서 노란색 박스
- 비활성상태 : 액티비티의 화면이 출력되고 있지 않는 상태, 종료된 것은 아님, 위 그림에서 주황색 박스
2. 활성상태
- 활성상태 : 하나의 Activity가 실행되어서 화면에 출력되고 유저 이벤트를 받아들일 수 있는 상태
- 객체가 생성된 후 onCreate(), onStart(), onResume() 함수까지 호출된 상태가 활성 상태
- 보통 setContentView() 함수가 onCreate()에서 실행됨(onStart()나 onResume()에 비해 onCreate()는 최초 한번만 실행되기 때문)
3. 일시정지상태
- 일시정지상태 : 유저 화면에 여전히 보이지만 유저 이벤트를 받아들이지 못하는 상태
- onPause() 함수가 호출된 상태가 일시정지 상태
- ex) A 액티비티를 띄어놓았는데 split view로 만들어서 B 액티비티를 띄우고 B 액티비티가 전면에 나오게 되는 경우
- 일시정지상태이다가 활성상태로 바뀔 때는 onResume() 함수가 다시 호출
4. 비활성상태
- 비활성상태 : 종료되지는 않았지만 유저 화면에 안보이는 상태
- 활성상태인 Activity가 onPause(), onStop() 함수까지 호출된 상태가 비활성상태
- 객체가 소멸되지는 않음
- ex) A 액티비티에서 B 액티비티로 화면 전환했을 때 A 액티비티의 상태
- 비활성상태이다가 활성상태로 바뀔 때는 onRestart(), onStart(), onResume() 함수까지 다시 호출
Save Instance
1. 액티비티 상태 저장
- Save Instance : 액티비티의 상태 저장 기법
- 액티비티가 종료되면 액티비티의 데이터는 모두 사라진다.
- 다시 실행시 복원 시켜야 하는 데이터가 있다면, 하지만 DB에 저장하기는 과한 경우 상태 저장 기법을 이용해야 한다.
2. 액티비티 상태 저장 예제
- 대표적인 예제 : 화면 회전
- onCreate() → onStart() → onResume() 과정으로 액티비티가 실행
- 이 상태에서 디바이스를 화면 회전 시키면 onPause() → onStop() → onDestroy() → onCreate() → onStart() → onResume() 과정으로 액티비티가 종료되었다가 실행됨
- 그래서 화면 회전 전의 데이터는 모두 사라지고 초기 상태가 나옴
3. Bundle
- onCreate(), onSaveInstanceState(), onRestoreInstanceState()의 매개변수
- Bundle : 데이터를 key-value 성으로 저장하고 있는 Map 객체
- Bundle에 담기는 데이터가 액티비티가 종료되어도 유지되었다가 다시 실행되었을 때 연결을 시켜준다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
}
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
}
- onSaveInstanceState() : 저장해야하는 데이터가 있는 경우 액티비티가 종료되기 전에 이 함수를 오버라이드 받아서 데이터를 저장
- onCreate(), onRestoreInstanceState() : 액티비티가 다시 실행됐을 때 복원할 데이터가 있는 경우 사용
- 차이점 : 데이터에 따라서 UI 구성을 다시 하는지 안하는지의 차이(보통 UI 구성은 onCreate()에서 하니까)
outState.putString("data1", "hello")
outState.putInt("data2", 10)
- Bundle에 데이터 저장은 putString(), putInt() 등의 함수 사용
count = saveInstanceState.getInt("count")
- Bundle 객체에서 데이터 획득은 getString(), getInt() 등의 함수 사용