(안드로이드) 안드로이드 액티비티 생명주기 메소드


<동적상태 vs 영속적상태>

액티비티 생명주기를 관리하는 주 목적은 적시에 액티비티 상태를 저장하거나 복원하기 위함이다. 상태(state)는 액티비티가 현재 보존하고 있는 데이터와 현재 보이는 사용자 인터페이스 데이터( 화면에 나타난 뷰 객체의 데이터) 를 의미한다.
예를들어, 액티비티는 데이터베이스, 콘텐트 제공자, 파일 등에 저장될 필요가 있는 메모리의 데이터를 유지할 수 있다. 그런 상태정보를 영속적상태라고한다.

화면에 보이는 사용자 인터페이스는 동적상태라한다.(사용자인터페이스 상태 또는 인스턴스 상태)


예를들어,액티비티 A가 백그라운드에 있다가 포그라운드로 올 수 있다. 따라서 액티비티A가 포그라운드로 돌아오면 자신이 입력했던 텍스트가 그대로 남아있을 것이라 생각한다.
그러나 이 경우 액티비티A의 새로운 인스턴스가 생성되므로, 만일 동적 상태 데이터가 저장되어 복원되지 않았다면 사용자가 이전에 입력한 데이터는 유실된다.


*안드로이드에서는 장치의 구성이 변경되면(장치를 세웠다 눕혔다)액티비티의 인스터스를 새로 생성한다는 것에 유의하자.

그러므로 동적상태를 저장하는 주 목적은 포그라운드와 백그라운드 액티비티들간이 매끄러운 전환을 제공하는 것이다.


<액티비티의 생명주기 메소드>


Activity클래스는 생명주기 메소드를 많이 갖으며, 액티비티의 상태가 변경될 때 이벤터처리기(Event Handler)처럼 동작한다.
  • onCreate(Bundle savedInstanceState): 이 메소드는 액티비티 인스턴스가 최초 생성될 때 호출되며, 대부분의 초기화 작업을 하는데 이상적인 곳이다. 메소드 인자로 동적 상태 정보를 포함할 수 있는 Bundel객체를 인자로 전달한다. 그런 동적상태 정보는 직전에 생성되었다가 소멸된 동일 액티비티으 인스턴스로부터 전달되며, 일반적으로 사용자 인터페이스의 상태와 관련되는 데이터다.
  • onRestart(): 액티비티 런타임 시스템에 의해 이전에 중지되었다가 막 다시 시작될 떄 호출된다.
  • onStart(): onCreate()나 onRestart()메소드가 호출된 후 항상 바로 호출된다. 그리고 곧 사용자에게 보이게 될 것이라고 액티비티에게 알려준다. 만일 액티비티가 액티비티 스태의 맨 위로 이동하면 이 메소드가 호출된 다음에 onResume()이 호출될 것이다.
  • onResume(): 액티비티가 액티비티 스택의 맨 위에 있으며, 사용자와 현재 상호 동작하는 (실행중인) 액티비티임을 알려준다.
  • onPause(): 이 메소드 호출다음에는 onResume()또는 onStop()메소드 중 하나가 호출된다. 액티비티가 포그라운드로 돌아가는 경우는(계속 실행하기 위해)onResume()이 호출되며, (액티비티의 사용자 인터페이스를) 사용자가 볼 수 없게되면, onStop()이 호출된다. 이 메소드 내부에서는 액티비티에서 필요한 영속적데이터(콘텐트 제공자, 데이터베이스, 파일에 저장되는 데이터)를 저장하는 일을 해야한다. 이 메소드에서는 또한 에니메이션과 같이 CPU를 지나치게 사용하는 작업들을 중단해야한다.
  • onStop(): 이 메소드가 호출되면 액티비티가 더 이상 사용자에게 보이지 않는다. 이 메소드 호출 다음에는 onRestart()또는 onDestroy()가 호출된다. 액티비티가 다시 포그라운드로 돌아가면 onRestart()가 호출되며, 액티비티가 종료될 떄는 onDestroy()가 호출된다.
  • onDestroy(): 이 메소드는 액티비티가 막 소멸되려고 하거나 또는 자발적으로 소멸될 때 호출된다. 액티비티가 자신의 작업을 완료하고 finish()메소드를 호출했거나 또는 메모리르 해제하거나 구성 변경(예를들어, 장치의 가로/세로 방향 변경)이 생겨서 런타임이 액티비티를 종결하기 때문이다. 그러나 액티비티가 종료될 때 항상 onDestroy() 메소드가 호출되는 것은 아니라는 것에 유의하자.

이러한 생명주기 메소드와 더불어 액티비티의 동적상태를 저장하고 복원하기 위해 특별히 만들어진 두 개의 메소드가 있다.

  • onSavedInstanceState(Bundle outState): 현재의 동적 상태 데이터가 저장될 수 있게끔 액티비티가 소멸되기 전에 호출된다. 여기서 동적상태 데이터는 대개 사용자 인터페이스와 관련되는 것읃링. 이 메소드도 Bundle객체를 인자로 받으며, 저장되어야 하는 상태 데이터를 Bundle객체에 넣는다. 이 Bundle객체는 액티비티가 다시 시작될 때 onCreate()와 onRestoreInstanceState()메소드에 전달된다. 동적상태 데이터가 저장될 필요가 있다는 것을 런타임이 알 경우에만 이 메소득 호출된다는 것에 유의하자.
  • onRestoreInstanceState(Bundle savedInstanceState): 상태정보가 젖아되었던 이전 액티비티 인스턴스로부터 액티비티가 다시 시작하는 경우, 이 메소드는 onStart()메소드가 호출된 후 곧바로 호출된다. onCreate()처럼 이전 상태 데이터를 포함한 Bundle객체를 인자로 받는다. 그리고 onCreate()와 onStart()에서 액팁티의 초기화가 수행된 후에 이전 상태 데이터를 복원하는것이 더 좋을 때 이 메소드가 사용된다.

*주의: onRestoreInsanceState()와 onSavedInstanceState() 두 메소드를 제외한 나머지 메소드에서는 자신의 구현코드에 반드시에 Activity 슈퍼클래스의 오버라이딩 되는 메소드를 호출해 주어야 한다.

예)
protected void onRestart(){
  super.onRestart();
}



댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기