레몬 생으로 씹어먹으면 맛있어요. :: 안드로이드 라이프사이클(생명주기)

 안드로이드 어플리케이션은 자신의 프로세스 수명을 직접 제어하지 않으며, 안드로이드 런타임이 각 어플리케이션의 프로세스와 그 안에 있는 각 activity를 관리한다.

(그래서 홈버튼, 홀드 버튼 등의 처리를 iOS의 AppDelegate처럼 하지 않고, 각각의 Activity에서 해주는 것.)

 런타임이 프로세스와 activity의 종료와 관리를 다루는 동안, activity의 상태는 자신의 부모 어플리케이션 프로세스의 우선순위를 결정하는데 사용된다. 어플리케이션 우선순위는 런타임이 어플리케이션과 그 안에 실행중인 activity를 종료시킬 가능성에 영향을 미치게된다.
 
1. activity stack
 각 activity의 상태는 현재 실행 중인 모든 activity의 stack구조에서 activity가 차지하는 위치에 의해 결정된다. 새로운 activity가 시작되면 현재 foreground화면이 stack의 맨 꼭대기로 옮겨진다. 사용자가 뒤로 가기 버튼을 사용해 뒤쪽을 탐색하거나 foreground activity가 종료될 경우에는 이 stack의 최상위에 있는 activity가 활성상태가 된다.

(이걸 표현하는 좀 더 큰 그림이 있었던 것 같은데....)

 어플리케이션의 우선순위는 어플리케이션이 가진 activity가운데 가장 높은 우선순위를 가진 것에 의해 영향을 받는다. 안드로이드 런타임이 자원 해제를 위해 어떤 어플리케이션을 종료시켜야 하는지 결정할 때, 어플리케이션의 우선순위를 그들이 가진 activity에 기반을 두고 결정하기 위해 위 stack이 사용된다.


2. activity 생명주기
activity가 생성되고 종료되는 과정 동안 activity는 4가지의 상태를 전이한다.

활성(Active)
activity가 stack의 최상위에 있을 경우 이 activity는 현재 화면에 보이고 사용자 입력을 받는다. 안드로이드는 무슨 일이 있어도 활성 상태에 있는 activity가 살아있도록 노력하며, 이 activity가 필요로 하는 리소스를 확보하기 위해 필요에 따라 stack의 아래쪽에 있는 activity들을 종료시킬 수 있다. 다른 activity가 활성화되면 기존의 활성 activity는 일시 중지(Pause)된다.

일지 중지(Pause)
경우에 따라 activity는 화면에는 보이지만 포커스를 지니지 않을 수 있다. 이 상태는 투명한 activity나 화면 전체를 사용하지 않는 activity가 그 앞에 활성화되어 있는 경우이다. 일시 중지 상태가 되는 경우 activity는 활성 상태인것처럼 다뤄지지만 사용자 입력을 받지 않는다. 극단적인 경우, 안드로이드는 활성 activity를 위한 리소스 확보를 위해 일시 중지 상태의 activity를 종료시킬 수 있을것이다. 만약 activity가 완전이 가려지게 되면 그 activity는 중지상태가 된다.
 극단적인 경우를 생각 하면, 이 시점에 어플의 상태를 저장하는 구문을 넣어야 한다. (한번 실행한 상태를 계속 기억하게 하고 싶다면) iOS에서도 비슷한 위치에서 그런 작업을 해주어야 한다. 다른 어플이 메모리를 가져가겠다고 할때 onDestroy()처럼 뭔가 호출되면 참 좋을텐데... 양쪽 플랫폼 모두 제대로 지원하지 않는 것 같다.

중지(Stop)
activity는 화면에 보이지 않는다. 이 activity는 모든 상태 및 멤버 정보를 메모리에 남기지만, 만약 시스템이 활성 activity를 위해 메모리를 요청할 경우 리소스 확보를 위한 정리 후보 1순위가 된다. activity가 중지될 때는 데이터와 현재 UI상태를 저장하는 것이 중요하다. activity가 화면 밖으로 나가거나 닫히고 나면 그 activity는 비활성 상태가 된다.

비활성(Inactive)
activity는 종료되고 난 이후와 시작되기 이전 비활성 상태에 머문다. 비활성 activity는 activity stack에서 제거되며, 화면에 다시 나타내기 위해서는 재시작되어야 한다.




 activity가 시작되고 실행중일 때 다른 activity가 시작되면 그때까지 실행중이던 activity는 pause 상태로 전이된다. pause 상태로 존재하다 다른 어플리케이션에서 메모리를 요구할 경우 pause상태의 activity는 종료될 수 있다.
 만약 pause상태에 있던 activity를 사용자가 선택해서 다시 foreground로 되돌아가면 resume상태가 된다. 또 pause 상태에 있던 activity가 더이상 보이지 않게 되면 stop상태로 전이된다.
 stop상태에 있던 activity가 다시 foreground로 되면 restart에 의해 start상태로 돌아간다. stop상태에 있는 activity 역시 다른 어플리케이션이 메모리를 요구할 경우 종료되며 destroy로 전이될수도 있다.

다음은 activity에서 사용할 수 있는 각 상태변화에 대한 핸들러 메소드이다.




 activity의 상태전이는 비결정적이며 전적으로 안드로이드 런타임에 의해 다루어 진다. 안드로이드는 비활성 activity를 가진 어플리케이션을 종료하는 것으로 시작해, 이어서 중지된 것들, 그리고 극단적인 경우 일시 중지된 것들을 제거할 것이다.
 심리스한 사용자 인터페이스를 보장하기 위해서는 이들 상태 간의 전이가 사용자의 눈에 보여서는 안된다. 일시 중지나 중지 혹은 종료된 상태에서 다시 활성 상태로 이동하는 activity 간에는 차이점이 없어야 하므로, activity가 일시 중지 되거나 중지될 때는 모든 UI상태 변화를 저장하고 모든 데이터를 지속시키는 것이 중요하다. 만약 중지되거나 비활성된 activity가 다시 활성화되고나면 저장된 이들 값을 이용해 activity를 복구해야 하기 때문이다.


Posted by 레몬사과
,