안드로이드의 각 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버)들은 자신들만의 LifeCycle, 즉 생애주기를 가지고 있다.
여기서는 각각의 생애주기들에 대해서 설명해보려고 한다.
1. Activity Lifecycle
액티비티의 상태
- 활성(Active)
- 현재 화면에 액티비티가 표시되는 상태
- 일시정지(Paused)
- 화면에서 액티비티가 보이지만 사용자와 상호작용 할 수 없는 상태, 즉 화면에는 보이지만
포커스가 없이 흐려진 상태를 말하기도 합니다.
- 정지(Stopped)
- 다른 액티비티에 의해서 화면이 완전히 가려진 상태를 말합니다.
액티비티 상태변화에 따른 메소드 호출
Method | Description | Killable? | 다음 호출자 | ||
액티비티가 생성될 시에 호출 | No | onStart() | |||
액티비티가 정지하였다가 다시 시작하게 될 때 호출 | No | onStart() | |||
액티비티가 사용이 가능하게 되기전에 호출 | No | onResume() | |||
액티비티가 사용자와 상호작용하기 전에 호출 유의할점은 액티비티 스택의 제일 위에 있어야 함. | No | onPause() | |||
액티비티가 사용자와 상호작용을 중단할 때 호출 | Yes | onResume() | |||
액티비티가 완전히 화면에서 사라질 때 호출 | Yes | onRestart() | |||
액티비티가 완전종료될 때 호출 | Yes | nothing | |||
액티비티 생애주기 다이어그램
Saving Activity State
안드로이드는 메모리절약을 위해 액티비티를 강제 종료 시킬수 있다. 하지만 사용자는 그 액티비티의 이전 상태를 원할수도 있는데
강제종료되기 전의 상태를 보관하기 위해 onSaveInstanceState 메소드를 구현할 수 있다. 이 메소드는 onPause 메소드가 호출되기전에 호출한다.
Cordinating Activites
하나의 액티비티가 다른 액티비티를 호출할 때 이 2개 이상의 액티비티들은 생명주기를 경험하게 된다.
- 현 액티비티의 onPause() 호출
- 다음 액티비티의 onCreate() -> onStart() -> onResume() 호출
- 다음 액티비티가 멈추게 될경우 onStop() 호출후 이전 액티비티에서 onResume() 호출
2. Service Lifecycle
서비스의 생명주기 메소드들은 액티비티 메소드들이 Protected 인데 반해 Public 이다.
위의 오른쪽 그림과 같이 서비스가 다른것들에 의해 바인드 되어 지는 것을 허용한다면 onBind(), onUnbind(), onRebind() 메소드들이 호출된다.
3. Broadcast Receiver Lifecycle
브로드캐스트 리시버는 하나의 콜백 메소드만을 가진다.
- void onReceive(Context curContext, Intent broadcastMsg)
리시버에 브로드캐스트 메시지가 도착하면 onReceive() 메소드가 호출해 메시지 포함하는 인텐트 오브젝트를 전다한다.
브로드캐스트 리시버는 위 메소드가 실행하는 동안만 활성화가 이루어진다.
활성화된 브로드캐스트 리시버를 가진 프로세스는 강제종료 되는 것으로부터 보호된다.
4. Processes and Lifecycle
안드로이드는 메모리 부족사태가 오면 오래된 프로세스를 죽일 수 밖에 없는데, 어떤 프로세스를 유지하고 어떤 프로세스를 죽일 것인지 결정하기 위해
중요성 계층구조(importance hierarchy)를 이용한다. 이 중요성 계층구조를 통해서 어떤 것이 더 중요한지 결정을 내릴 수 있다. 중요성의 순서는 다음과 같다.
- 포어그라운드 프로세스는 사용자가 현재 수행하고 있는 것을 위해 요구되는 프로세스이다. 만약 하나의 프로세스가 아래와 같은 조건을 보유하고 있다면
그것은 포어그라운드 프로세스로 간주된다.- 프로세스가 사용자와 상호작용하는 액티비트를 실행하고 있다.
- 프로세스가 사용자와 상호작용하고 있는 액티비티에 연결되어진 서비스를 포함하고 있다.
- 프로세스가 생명주기 콜백메소드중 하나를 실행하고 있는 서비스 오브젝트를 가지고 있다.
- 프로세스가 onReceive() 메소드를 실행하고 있는 브로드캐스트 리시버 오브젝트를 가지고 있다.
- 비저블(visible) 프로세스는 어떤 포어그라우든 컴포넌트도 보유하지 않은 프로세스이다. 그러나 그것은 여전히 스크린 상에서 사용자가 보는 것에 영향을
미칠 수 있다. 만약 아래와 같은 조건을 보유하고 있다면 이 프로세스는 비쥬얼한 것으로 간주된다.- 프로세스가 포어그라운드가 아니지만 여전히 사용자에게 보이는 액티비트를 보유하고 있다.
- 프로세스가 비저블 액티비티에 연결된 서비스를 포함하고 있다.
- 서비스 프로세스는 startService() 메소드를 사용해서 시작된 서비스를 실행하고 있으면서, 위의 2개의 카테고리에 속하지 않는 프로세스이다. 비록 서비스
프로세스는 사용자가 보는 어떤 것과도 직접 결부되지는 않지만 그것들은 일반적으로 사용자가 신경쓰는 것들을 하고있다. 그래서 시스템은 모든 포어그라운드
프로세스와 비저블 프로세스를 계속 유지할 정도로 메모리가 충분치 않는 경우를 제외하고는 서비스 프로세스를 유지한다 - 백그라운드프로세스는 현재 사용자의 눈에 보이지 않는 액티비티를 보유하고 있는 프로세스이다. 이들 프로세스는 직접적으로 사용자의 행위에 영향을 주지 않으며, 포어그라운드, 비저블,
서비스 프로세스를 위한 메모리 재요청을 위해 언제든 강제 종료될 수 있다. 통상적으로 많은 백그라운드 프로세스가 존재하고 있으며, 그러므로 그것들은 가장 최근에 사용자에게 보여진
액티비티를 가진 프로세스가 가장 최후에 강제 종료될 수 있도록 하기 위한 LRU(Least Recently Used, 최근에 가장 적게 사용된) 목록으로 관리된다. 만약 액티비티가 정확한 생명주기
메쏘드들을 구현하고 있고 그것들의 현재 상태를 정확하게 포착하고 있다면, 그것이 속한 프로세스가 강제종료되는 것은 사용자에게 유해한 영향을 끼치지 않을 것이다. - 엠프티(empty) 프로세스는 어떤 형태의 활성화된 컴포넌트도 보유하고 있지 않는 프로세스이다. 이러한 프로세스를 유지하는 유일한 이유는, 그 안에서 다음 번에 실행되어야 하는 컴포넌트의 구동시간을 개선하기 위한 캐쉬cache로써의 역할 때문이다. 시스템은 프로세스 캐쉬와 하단에 놓여있는 커널 캐쉬 간의 시스템 전역에 걸친 리소스들에 대한 균형을 유지하기 위해 가끔 이런 프로세스를 강제 종료시킨다.
댓글 없음:
댓글 쓰기