본문 바로가기
프로그래밍/Android

액티비티 재생성

by Daniel.kwak 2019. 2. 16.

액티비티 재생성 

정상적인 앱 동작으로 인해 액티비티가 정지되는 경우를 알아보자.

  • 사용자가 Back버튼을 누르는 경우
  • 액티비티가 finish()를 호출하여 자체적으로 종료하는 경우
  • 액티비티가 전면에서 오랬동안 사용되지 않는 경우
  • 전면에 있는 액티비티가 많은 리소스를 필요로 하여 백그라운드 프로세스를 종료할 때

앞의 두 경우는 더 이상 액티비티가 필요하지 않다는 사용자의 의지가 명확하므로 시스템에서 더 인스턴스를 유지하지 않는다. 
그러나 시스템에 의해 강제로 소멸한 경우 시스템은 액티비티 인스턴스를 기억한다. Bundle 객체의 '키-값' 쌍의 컬렉션에 이러한 정보가 저장된다.
*액티비티가 화면을 회전할 때마다 액티비티는 완전히 소멸된 후 다시 생성된다. 이유는 화면 구성이 바뀌어 레이아웃의 대체 리소스를 로딩해야 하기 때문

시스템은 Bundle 인스턴스를 사용하여 액티비티 레이아웃의 View객체에 대한 정보를 저장한다.(EditText에 입력된 텍스트 값 등) 따라서 액티비티 인스턴스가 소멸되고 재생성된 경우, 레이아웃 정보는 별도 코드 요청 없이 복원된다. (간혹 액티비티에 사용자 진행상태를 저장하고 싶을 경우 더 많은 정보를 저장할 수 있다.)
*Android 시스템에서 레이아웃 뷰를 복원하기 위해서는 android:id 라는 특성을 가지고 있어야 한다.


액티비티에 대한 추가 정보를 저장하려면 onSavedInstanceState()를 재정의해야한다. 시스템은 사용자가 액티비티를 떠날경우 Bundle 객체를 저장하며 액티비티가 예기치 않게 종료됐을 경우 저장했던 Bundle객체를 전달한다. 시스템은 나중에 액티비티를 재시작하는 경우 저장했던 Bundle객체를 onRestoreInstanceState()혹은 onCreate로 전달한다. 


*화면이 회전될 때 마다 액티비티가 소멸되고 재생성되는것을 막고싶다면 Manifest파일에서 방향 변화에 대응을 해주는 속성을 추가해주면 된다. 추가하면 더 이상 액티비티가 소멸 후 재 생성되지 않으며, onConfigurationChanged()만 호출된다.