외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 22(액티비티 생명 주기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 22(액티비티 생명 주기)

Nova_ 2023. 2. 8. 11:20

- 액티비티 상태

액티비티를 다룰때는 생명주기를 이해하고 각 상황에 맞게 대처해야합니다. 여기서 생명주기란 액티비티가 생성되어 소멸하기까지의 과정을 말하며 액티비티 클래스는 액티비티가 상태변화를 알아차릴 수 있는 여러가지 콜백 함수를 제공합니다. 이 콜백 함수에 액티비티 상태가 바뀔때마다 앱이 어떻게 동작해야하는지를 구현합니다. 액티비티의 상태는 다음처럼 크게 3가지로 구분할 수 있습니다.

  • 활성 : 액티비티 화면이 출력되고있고 사용자가 이벤트를 발생시킬 수 있는 상태
  • 일시 정지 : 액티비티의 화면이 출력되고 있지만 사용자가 이벤트를 발생시킬 수 없는 상태
  • 비활성 : 액티비티의 화면이 출력되고 있지 않은 상태

 

- 활성 상태

활성 상태는 액티비티가 실행되어 화면에 나오고 사용자 이벤트를 처리할 수 있는 상태를 의미합니다. 콜백함수 입장에서 본다면 onCreate() -> onStart() -> onResume() 함수까지 호출된 상태입니다. 그리고 setContentView() 함수로 출력한 내용이 액티비티 화면에 나옵니다.

 

- 일시 정지 상태

일시정지 상태는 onPause() 함수까지 호출된 상태입니다. 일반적으로 액티비티가 화면에 보이지만 포커스를 잃어 사용자 이벤트를 처리할 수 없는 상태를 의미합니다.가장대표적인 예는 화면 분할 모드에서 확인할 수 있습니다.

화면 분할 모드에서 카카오톡을 터치하면 갤러리의 포커스를 잃어버려 갤러리는 일시정지 상태가 됩니다. 이후 다시 갤러리를 터치하면 onResume() 함수가 자동으로 호출되어 포커스가 옮겨가게됩니다. 참고로 액티비티에서 대화상자를 띄운 상태는 이벤트가 발생한 상황으로 일시정지 상태는 아닙니다.

 

- 비활성 상태

비활성 상태란 액티비티가 종료되지 않고 화면에만 보이지 않는 상태를 말합니다. 인텐트로 다른 액티비티를 실행했거나 홈 버튼을 눌러 런처 화면으로 이동해 액티비티가 보이지앟는 상황입니다. 콜백 함수 입장에서 보면 onPause() -> onStop() 함수까지 호출되며 그리고 다시 액티비티를 화면에 보이게하면 onRestart() -> onStart() -> onResume() 함수까지  호출되어 활성화 상태가 됩니다.

 

- 액티비티의 상태 저장

일반적으로 액티비티가 종료되면 즉, onDestroy() 함수가 실행되면 객체가 소멸하므로 액티비티의 데이터는 모두 사라집니다. 그런데 액티비티가 종료될때 유지해야할 데이터를 저장했다가 다시 실행할때 복원할 수 있습니다. 이때 사용하는 콜백함수는 onSaveInstanceState() 함수와 onRestoreInstanceState() 함수이며 실행 순서는 아래와 같습니다.

  • onPause() -> onStop() -> onSaveInstanceState() -> onDestroy() 
  • onCreate() -> onStart() -> onRestroeInstanceState() -> onResume() 

만약 액티비티를 종료할때 저장했다가 복원해야할 데이터가 있다면 Bundle이라는 객체에 담아주면됩니다. 다른 생명주기 함수는 매개변수를 가지지 않지만 onCreate(), onSaveInstanceState(), onRestoreInstanceState() 함수는 매개변수를 가지며 모두 Bundle 개게입니다. 그러므로 이 번들 객체를 이용해 데이터를 저장하고 복원할 수 있습니다. 아래는 번들 객체 사용 방법입니다.

override fun onCreate(savedInstanceState: Bundle?) { //저장된 번들 전달
    super.onCreate(savedInstanceState)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) { //번들 복원
    super.onRestoreInstanceState(savedInstanceState)
}

override fun onSaveInstanceState(outState: Bundle) { //번들 저장
    super.onSaveInstanceState(outState)
}

아래는 번들에 데이터를 저장하는 예시입니다.

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("data1", "hello")
    outState.putInt("data2", 10)
}

아래는 번들에 저장된 데이터를 가져오는 코드 예시입니다.

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    val data1 = savedInstanceState.getString("data1")
    val data2 = savedInstanceState.getInt("data2")
}
Comments