프로세스는 더이상 필요하지 않고 시스템이 다른 어플리케이션에 사용하기 위해 메모리를 회수해야 할 때까지 계속 실행됩니다.
안드로이드의 특징은 어플리케이션 프로세스의 수명 주기 전체 기간이 어플리케이션 자체에 의해 직접 제어되지 않는다는 점입니다. 대신 이 수명 주기 전체 기간은 시스템이 실행 중인 것으로 파악하는 어플리케이션 요소, 요소들이 사용자에게 중요한 정도 및 시스템에서 사용할 수 있는 전체 메모리 양을 조합하여 시스템에 의해 결정됩니다.
메모리가 부족할 때 종료해야 하는 프로세스를 결정하기 위해 안드로이드는 프로세스 내에서 실행 중인 컴포넌트 및 컴포넌트의 상태에 따라 각 프로세스를 '중요도 계층 구조'에 배치합니다.
아래에 중요도 순서로 프로세스 유형을 정리합니다.
- Foreground process
사용자가 현재 사용하고 있는 프로세스입니다. 다음 조건 중 하나라도 해당하면 프로세스가 foreground에 있는 것으로 간주됩니다.
- 프로세스가 사용자와 상호작용하고 있는 화면 상단에서 Activity를 실행 중입니다.(onResume() 메서드가 호출되었음)
- 프로세스에 현재 실행 중인 BroadcastReceiver가 있습니다.(BroadcastReceiver.onReceive() 메서드가 실행 중임)
- 프로세스에 콜백(Service.onCreate(), Service.onStart() 또는 Servcie.onDestroy())중 하나에서 현재 코드를 실행 중인 Service가 있습니다.
이러한 프로세스는 시스템 상에 몇개 밖에 존재할 수가 없는데, 그럼에도 불구하고 메모리가 매우 부족하여 이러한 프로세스조차 계속 실행할 수 없을 때 최후의 수단으로 foreground 서비스를 종료합니다.
- Visible process
사용자가 현재 알고 있는 작업을 하는 프로세스를 visible로 간주합니다.
- 프로세스가 화면상으로는 사용자에게 표시되지만 foreground에 있지 않은 Activity를 실행 중입니다.(onPause() 메서드가 호출되었음)
- 프로세스에 Service.startForeground()를 통해 foreground 서비스로 실행 중인 Service가 있습니다.
- 프로세스가 시스템에서 라이브 배경화면, 입력 방법 서비스 등과 같이 사용자가 알고 있는 특정 기능에 사용하는 서비스를 호스팅하고 있습니다.
- Service process
startService() 메서드로 시작된 Service를 유지하는 프로세스입니다. 이러한 프로세스는 사용자에게 직접 표시되지 않지만 일반적으로 사용자가 관심을 가진 작업(ex. 백그라운드 네트워크 데이터 업로드 또는 다운로드)을 실행합니다.
오랫동안(ex. 30분 이상) 실행되고 있는 서비스는 중요도가 강등됨에 따라 이 프로세스가 캐시된 LRU 목록으로 이전될 수 있습니다.
- Cached process
현재 필요하지 않은 프로세스입니다. 따라서 시스템은 다른 곳에서 메모리가 필요할 때 언제든 원하는 대로 이 프로세스를 종료할 수 있습니다. 정상적인 상황에서는 모두 항상 사용 가능하지만 매우 심각한 상황에서만 시스템이 캐시된 프로세스를 모두 종료하고 서비스 프로세스 종료를 시작해야 하는 시점에 이르게 됩니다.
참고
https://developer.android.com/guide/components/activities/process-lifecycle?hl=ko