대부분의 경우 모든 안드로이드 앱은 자신의 리눅스 프로세스에서 실행됨
앱의 프로세스 수명이 앱에 의해 결정되지 않음
액티비티, 서비스, 브로드캐스트 리시버와 같은 앱 컴포넌트가 앱 프로세스 수명에 어떻게 다르게 영향을 주는지 이해해야 함, 그렇지 않으면 중요한 일을 하는 도중에 시스템이 앱의 프로세스를 종료할 수 있음
안드로이드는 프로세스를 실행 중인 컴포넌트, 그 컴포넌트의 상태를 토대로 중요도 계층 구조를 만듬, 그리고 이 계층 구조에 따라 메모리가 부족할 때 어떤 프로세스를 종료할지 결정함
우선순위는 다른 프로세스와의 종속성에 의해 결정될 수도 있음, 예를 들어 프로세스 A가 Context.BIND_AUTO_CREATE
플래그를 사용하여 서비스에 결합되었거나 프로세스 B의 ContentProvider
를 사용하고 있다면 프로세스 B는 항상 프로세스 A의 분류 이상의 우선순위를 가짐
사용자의 현재 작업에 필요한 프로세스
이런 프로세스는 시스템에 몇 개만 존재하며 메모리가 너무 부족해 이런 프로세스가 계속 실행될 수 없을 때 마지막 수단으로 종료됨, 이런 상황이 일어난다면 장치가 메모리 페이징 상태에 도달한 것으로 ui 반응성을 유지하기 위해 상황이 일어남
프로세스를 이 상태로 만드는 컴포넌트의 조건
Service.onCreate()
, Service.onStart()
, Service.onDestroy()
와 같은 콜백이 실행중인 프로세스는 포그라운드에 둠사용자가 인지하고 있는 작업을 하는 프로세스
이 프로세스가 종료되면 사용자 경험에 안좋은 영향을 끼침
포그라운드 프로세스의 수보다 적은 수로 있게 제한되어 있음
매우 중요하다고 고려되기 때문에 포그라운드 프로세스를 실행하는데 메모리가 부족한 경우가 아니라면 종료되지 않음
프로세스를 이 상태로 만드는 컴포넌트의 조건
onPause()
가 불린 경우), 예를 들면 다이얼로그가 떠있을 때 뒤에 가려진 액티비티가 이런 경우에 해당Service.startForeground()
로 실행되어 포그라운드 서비스로 실행된 경우startService()
메소드를 통해 실행된 서비스가 존재한 프로세스
사용자에게 보이진 않지만, 일반적으로 사용자가 신경을 쓰는 작업을 하기 때문에 포그라운드 프로세스와 가시적 프로세스를 실행하는데 메모리가 부족하지 않다면 종료시키지 않음
긴 시간동안 실행되는 서비스는 중요도가 내려갈 수 있음, 따라서 오랜 기간 동안 실행되어야 하는 서비스는 포그라운드 서비스로 생성하거나, 특정 시간에 실행되어야 하는 작업의 경우 AlarmManager
를 사용할 수 있음
현재 필요하지 않은 프로세스, 시스템이 자원이 필요할 때 종료시킬 수 있음
잘 작동되는 시스템은 이런 프로세스를 앱 사이의 효율적인 교체를 위해 어느정도 유지를 하고 필요하다면 종료시킴
시스템에 의해 언제나 종료될 수 있기 때문에 사용자에게 중요한 일을 해야 한다면 활성화된 프로세스에서 처리되어야 함
사용자에게 더 이상 보이지 않는 액티비티 인스턴스를 가질 수 있는데 앱을 액티비티 수명주기에 맞게 만들었다면 시스템이 프로세스를 종료해도 이전 상태를 복구할 수 있기 때문에 사용자 경험에 영향을 주지 않음
리스트에 저장되어 있음, 이 리스트의 정확한 순서 정책은 플랫폼의 구현 세부 정보임
일반적으로 다른 유형의 프로세스보다 사용자의 홈 애플리케이션을 호스팅하는 프로세스 또는 사용자가 마지막으로 본 활동과 같이 더 유용한 프로세스를 유지하려고 함
허용되는 프로세스 수에 엄격한 제한을 설정하거나 프로세스가 지속적으로 캐시된 상태를 유지할 수 있는 시간의 제한 등 프로세스 종료에 관한 다른 정책도 적용할 수 있음
원문: https://developer.android.com/guide/components/activities/process-lifecycle