프로그래밍/안드로이드

안드로이드 액티버티 생명 주기와 BackStack

Terry Cho 2015. 6. 22. 01:43

안드로이드 Activity Lifecycle (액티버티 생명주기)와

, Back Stack & Task


조대협 (http://bcho.tistory.com)


Back Stack

Activity의 라이프 사이클 개념을 이해하기 전에, 먼저 BackStack이라는 개념을 이해해야 한다.
안드로이드 애플리케이션은 모바일 애플리케이션의 특성상 하나의 화면, 즉 Activity만 화면에 활성화가 되게 된다. 활성화 된 화면에서 작업하다가, Back 버튼등을 눌러서 이전화면으로 돌아갈 수 있는데, 이런 돌아가는 구조를 지원하기 위해서, 내부적으로 화면이 전환이 되더라도 기존의 화면을 없애는것이 아니라 메모리에 저장해놨다가, 돌아갈때 저장된 화면을 띄워 주는 구조가 된다
이런 구조를 구현하기 위해서 내부적으로 BackStack이라는 구조를 사용하는데, 각각의 화면이 Activity이기 때문에, 화면이 전환될때 마다, 그 Activity를  BackStack안에 저장한다. 그리고, Back 버튼등으로 돌아기기를 할 경우에는 Stack에서 하나씩 꺼내서 이전 화면으로 전환을 한다

아래 그림을 보자, 
  • 처음에 Activity 1 화면이 활성화 되었다.
  • 다음에 Activity 2가 실행되면, Activity 1이 BackStack에 저장된다.
  • 그 다음에 Activity 3이 실행되면, Activity 2가 BackStack에 추가적으로 저장되는 것을 볼 수 있다.
  • 이때 Activity 3가 Back 버튼등에 의해서 종료되면, Activity 3는 Destroy 되고, Back Stack에 있던 Activity2 가 활성화 된다.





Task

A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack), in the order in which each activity is opened.

BackStack의 개념을 대략적으로 이해한후에, Task라는 개념을 이해하는게 좀 어려웠는데, Task하는 하나의 BackStack이라고 생각하면 된다. 그런데 왜 굳이 이 Task라는 개념을 사용하느냐? 아직은 잘 모르겠지만, 글들을 읽어보면 일단 키 포인트는 안드로이드 애플리케이션의 Activity는 서로 다른 application간에 공유가 가능하다.
즉, 내가 A라는 애플리케이션을 수행하다가, SNS 공유와 같은 기능을 사용할때, SNS 애플리케이션 B의 Activity들을 불러올 수 있다.  또는 이메일 클라이언트에서, 사진앱의 activity들을 불러서, 첨부 사진을 선택할 수 있다.

그렇다보니, 하나의 Activity는 동시에 여러개의 애플리케이션에 의해서 사용될 수 있기 때문에, 다른 개념을 사용하는데, 이를 Task 라고 한다. 현재 실행중인 애플리케이션의 Activity Stack은 이 Task라는 곳에 저장이 되게 된다.
(일종의 instance 개념과 유사한듯)


Activity의 라이프 사이클

Activity는 사용자와 Interaction이 있는 UI를 처리하는 컴포넌트로 다음과 같은 생명 주기를 갖는다. 각 주기마다 이벤트에 의해서 호출되는 함수들을 정리하면 다음과 같다.





  • OnCreate : 맨 처음 랩이 처음 실행되었을때, 실행되는 메서드로 UI 컴포넌트등을 로딩하고, Listner를 바인딩하고, 초기 데이타를 로딩하는 등의 초기화 작업을 수행한다.
  • OnStart : UI가 화면에 보이기 전에 바로 호출된다. UI가 로딩 된다고 해도, 사용자로 부터 Input을 받을 수 는 없다
  • OnResume : UI 로딩이 끝난후, 사용자 Input (Interaction)이 시작되기 전에 호출된다. 이 함수들이 다 호출되고 나면, 애플리케이션은 실행 가능 상태인 “Activity Running” 상태가 되며, UI도 모두 로딩되고, 사용자로 부터 입력을 받을 준비도 끝난다.
  • OnPause : 이 상태에서 만약에 다른 Activity 화면이 올 경우, OnPause가 호출된다.
    정확한 상태 정의는 “보이기는 하지만 사용자가 Interaction을 할 수 없는 상태” 정도로 정의할 수 있다. 이런 상태가 어떤 상태인가 하면, 다이얼로그등과 같은 다른 액티버티가 앞에 떠서 사용자 Interaction을 수행하는 상태이다 그러나 기존의 Activity는 그대로 뒤에 떠 있지만, 뒤에 떠 있는 activity 는 사용자 Interaction을 받지 못하는 상태이다.
 




이 때 사용중인 쓰레드 정리, 데이타 저장등을 수행하거나 또는 포커스를 잃은 화면이기 때문에 애니메이션등을 정지해야 한다.
  - 이때 다시 해당 Activity로 돌아가게 되면 OnResume으로 다시 돌아가서, 화면을 다시 호출하게 된다.
  - 화면이 보이지 않는 상태에서 만약에 메모리가 부족하게 되면 안드로이드 시스템에 의해서 이 단계에서 자동으로 정지(Killed) 될 수 있다. Killed 된 상태에서 다시 그 화면으로 돌아가게 되면 다시 onCreate로 돌아가서 앱을 처음부터 다시 시작하게 된다.

  • OnStop : 액티버티가 더이상 사용자에게 보여지지 않을때 호출된다. 
  • OnDestroy : 액티버티가 소멸될때 호출된다. 

Activities in the system are managed as an activity stack. When a new activity is started, it is placed on the top of the stack and becomes the running activity -- the previous activity always remains below it in the stack, and will not come to the foreground again until the new activity exits.

An activity has essentially four states:

  • If an activity in the foreground of the screen (at the top of the stack), it is active or running.
  • If an activity has lost focus but is still visible (that is, a new non-full-sized or transparent activity has focus on top of your activity), it ispaused. A paused activity is completely alive (it maintains all state and member information and remains attached to the window manager), but can be killed by the system in extreme low memory situations.
  • If an activity is completely obscured by another activity, it is stopped. It still retains all state and member information, however, it is no longer visible to the user so its window is hidden and it will often be killed by the system when memory is needed elsewhere.
  • If an activity is paused or stopped, the system can drop the activity from memory by either asking it to finish, or simply killing its process. When it is displayed again to the user, it must be completely restarted and restored to its previous state.

각 단계별로 실제로 돌아가는 걸 볼래면, 한번 만들어보고 이벤트 걸고 추적해봐야 겠다.