1. 프로세스
- 애플리케이션이 시작될때 안드로이드 시스템에서 하나의 스레드(메인스레드)로 구성된 프로세스를 시작시킨다.
- 프로세스의 수명주기가 애플리케이션 자체에 의해 직접 제어되지 않는다. 시스템에 의해 제어되는 프로세스는 우선순위등에 따라 종료되며 종속성을 갖는다.
🙋♀️ 애플리케이션 1개에 1개의 프로세스만 생성될까?
매니페스트에 android:process 속성을 정의하여 특정 구성요소가 별개의 프로세스에서 동작도록 정의할 수 있다.
프로세스 우선순위
메모리 자원을 회수하기 위해 각 프로세스에 대해 우선순위를 부여한다.
1. Foreground Process
활성 프로세스로 사용자가 현재 상호작용 하고 있는 애플리케이션
- Activity : Activity.onResume()이 호출됨 (=Activity 실행중)
- BroadcastReceiver : BroadcastReceiver.onReceive()이 실행중임. (=BroadcastReceiver 실행중)
- Service : Service.onCreate(), onStart(), onDestroy()이 실행중임. (=Service 실행중)
2. Visible Process
- Activity : 화면에 보이지만 비활성 상태의 프로세스 (onPause()가 호출됨)
(Dialog가 띄워진 상태의 Activity or Fragment)
- Service : Service.startForeground()를 통해 Foreground Service로 실행중인 Service
3. Service Process
- 화면에 보이는 인터페이스 없이 계속되어야 하는 처리를 담당하는 프로세스
- Service : Service.startService()로 시작된 Service
(백그라운드 네트워크 데이터 업로드/다운로드등)
- 오랫동안(예:30분이상) 실행되고 있는 서비스는 중요도가 강등됨에 따라 이 프로세스가 캐시된 LRU목록으로 이전될 수 있다.
4. Cached Process
- 현재 필요하지 않은 프로세스
- 메모리관리와 관련된 프로세스
- 가장 오래된 프로세스를 정기적으로 종료한다.
- 현재 사용자에게 표시되지 않는 하나 이상의 Activity인스턴스를 포함한다(onStop() 메소드가 호출되어 반환됨)
- 캐시가 되어 재구동시 초기구동보다 빠르게 시작할 수 있다.
- 제거순서는 LRU이다.
2. 스레드
- 동일한 프로세스에서 동작하는 모든 안드로이드 컴포넌트는 메인스레드에서 처리되며 각각의 컴포넌트에 대한 시스템 호출은 메인스레드로 전달된다.
(onKeyDown(), onResume()...)
- 메인스레드가 일정시간 블록될경우 ANR이 발생한다.
(때문에, 네트워크등 별도의 작업은 background or worker스레드에서 처리하도록 한다.)
안드로이드와 멀티스레드
- 안드로이드 어플리케이션을 실행하면, 시스템은 메인액티비티를 메인 메모리로 올려 프로세스를 만들며, 이 때 메인스레드가 자동으로 생성된다.
- 메인스레드에서 무거운 작업을 하면 ANR로 전환되기 때문에 별도의 스레드에서 무거운 작업을 한다.
- 이렇게 만든 별도의 스레드의 작업을 반영하기 위해 메인스레드와의 통신이 필요하다.
스레드가 핸들러로 메세지를 전달하며, 그 메세지는 메세지큐에 저장되고, 루퍼가 그 큐에서 데이터를 꺼내고 핸들러에게 전달한다. 핸들러는 전달받은 메세지를 실행하거나 전달한다.
1. 핸들러
- 스레드 간의 통신을 담당한다.
- 루퍼로 부터 받은 메세지를 실행하거나 다른스레드로부터 메세지를 받아서 메세지 큐에 넣는다.
2. 루퍼
- 무한루프를 돌며 자신이 속한 스레드의 메세지큐에서 메세지를 꺼내서 핸들러에게 전달한다.
- 안드로이드에서 핸들러 스레드를 사용하면, 루퍼를 갖고있는 스레드를 생성할 수 있다.
3. 메세지큐
- 스레드가 다른 스레드나 혹은 자기 자신으로부터 전달받은 Message를 보관하는 Queue이다(FIFO).
참고 1
참고 2