본문 바로가기

Android/Process

안드로이드/Android 프로세스 우선순위

안드로이드/Android 프로세스 우선순위




안드로이드 어플리케이션은 자신의 생명 주기를 제어할 수 없다. 대신, 어플리케이션 컴포넌트는 반드시 어플리케이션의 상태변화에 귀기울여 그에 따라 적절히 반응해야 하며, 불시 종료에 대비하도록 신경 써야 한다.

각 안드로이드 어플리케이션은 기본적으로 별도의 Dalvik 인스턴스를 실행하고 있는 자기 자신만의 프로세스 내에서 실행된다. 각 어플리케이션의 메모리와 프로세스 관리는 런타임에 의해 배타적으로 처리된다.
안드로이드는 자신의 리소스를 공격적으로 관리하며, 장치가 좋은 반응성을 가진 상태로 남아있도록 보장하기 위한 것이라면 무엇이든 한다. 이는 우선순위가 높은 어플리케이션을 위해 리소스 확보가 필요한 경우, 우선순위가 낮은 프로세스가 경고없이 종료될 수 있음을 뜻한다.

1. 활성 프로세스(foreground activity)
활성 프로세스는 사용자가 현재 상호작용하고 있는 컴포넌트를 가진 어플리케이션이다. 안드로이드가 리소스 회수를 통해 좋은 반응성을 가진 채로 유지하려는 프로세스가 바로 이 프로세스다. 이들 프로세스는 일반적으로 매우 적은 수가 존재하며, 최후의 수단으로서만 종료될 것이다.

  • 활성상태에 있는 Activity. 즉, 이들은 foreground 에 있으면서 사용자 이벤트에 반응한다.
  • 현재 onReceive 이벤트 핸들러를 실행 중인 Activity나 서비스 또는 broadcast 수신자.
  • onStart나 onCreate 또는 onDestroy 이벤트 핸들러를 실행 중인 서비스

2. 화면에 보이는 프로세스(visible activity)
화면에 보이지만 비활성 프로세스는 화면에 보이는 Activity를 가지고 있는 것들이다. 화면에 보이는 Activity는 눈에 보이긴 하지만 foreground에 있지 않거나 사용자 이벤트에 반응하지 않는다. 이는 Activity가 부분적으로 가려지는 경우 발생한다. 이러한 프로세스는 일반적으로 매우 적은 수가 존재하며, 활성 프로세스가 계속 진행되도록 허용하기 위한 극한 상황에서만 종료될 것이다.

3. 시작된 서비스 프로세스
서비스는 화면에 보이는 인터페이스 없이 계속실행되어야 하는 처리를 지원한다. 서비스는 사용자와 직접 상호작용하지 않기 때문에, 화면에 보이는 Activity에 비해 낮은 우선순위를 부여 받는다. 하지만 시작된 서비스 프로세스는 foreground 프로세스로 간주되며, 활성 프로세스나 화면에 보이는 프로세스를 위해 리소스가 필요한 경우가 아니라면 종료되지 않을 것이다.

4. Background 프로세스
화면에 보이지 않는 Activity를 가지고 있으며 시작된 서비스를 가지지 않는 프로세스이다. 안드로이드가 foreground 프로세스를 위한 리소를 얻기 위하여 last-seen-first-killed pattern을 이용해 종료시킨다. 일반적으로 많은 수가 존재한다.
만약 background 프로세스를 제거한 후 사용자가 그 activity로 다시 돌아가길 원한다면 해당 화면을 다시 보여주어야 하는데, 이때는 activity의 onCreate(Bundle saveInstanceState) 메소드의 saveInstanceState 파라미터를 이용한다.
background activity를 제거할때 onSaveInstanceState(Bundle saveInstanceState)메소드가 호출되는데, 이 때 중요한 데이터를 saveInstanceState에 저장할 수 있다. saveInstanceState 파라미터에 저장한 내용은 onCreate() 매소드의 파라미터로 전달된다. 따라서 이 파라미터를 이용하면 background activity가 제거되기 전의 상태로 다시 시작할 수 있다.

5. 빈(Empty) 프로세스
안드로이드는 전체적인 시스템 성능 향상을 위해, 어플리케이션이 수명을 다한 뒤에도 종종 이들을 메모리에 존속시킨다. 안드로이드는 이들이 다시 띄어질때 어플리케이션 구동 시간을 향상 시키기 위하여 이 Cache를 이용한다. 이들 프로세스는 메모리가 부족해지면 시스템에 의해 즉시 제거된다.