[안드로이드] 프로세스와 생명주기

반응형



안드로이드 시스템은 메모리가 부족하여 실행되어야 할 프로세스가 실행되지 않는 것을 방지하기 위해 오래된 프로세스를 제거하는 방식을 사용합니다.

읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥


여기에서 어떤 프로세스를 유지하고 어떤 프로세스를 죽일것인지는 무엇을 보고 판단하는 걸까요?

바로 각각의 프로세스내에서 실행되는 컴포넌트 상태의 '중요성 계층구조(importance hierarchy)' 를 이용합니다.

가장 낮은 중요성을 가진 프로세스가 가장 먼저 제거되고, 그 다음순으로 진행되지요.
그 계층구조에는 다섯 단계가 존재합니다.


1. 포그라운드 ( foreground ) 프로세스

포그라운드 프로세스는 현재 사용자와 커뮤니케이션하는 프로세스 입니다.

아래와 같은 조건을 가지고 있다면 포그라운드 프로세스로 간주합니다.
● 프로세스가 사용자와 상호작용하는 액티비티를 실행중
● 사용자와 상호작용하는 액티비티에 연결된 서비스를 포함하고 있음
● 생명주기 메소드 ( onCreate(), onStart(), onDestroy() ) 중 하나를 실행중인 서비스 객체를 가지고 있음
● onReceive() 메소드를 실행중인 브로드캐스트리시버 객체를 포함하고 있음


2. 비지블(visible) 프로세스

비지블 프로세스는 포그라운드 프로세스를 보유하지 않았지만 사용자에게는 보일 수 있는 프로세스 입니다.

아래와 같은 조건을 가지고 있다면 비지블 프로세스로 간주합니다.
● 포그라운드가 아니지만 여전히 보여지는 액티비티를 보유 중
● 비지블 액티비티에 연결된 서비스를 포함하고 있음

☞  비지블 프로세스는 포그라운드 프로세스가 더 이상 실행 될 수 없을 정도의 상황이 아니라면 강제 종료 되진 않습니다.



3. 서비스 ( service ) 프로세스

서비스프로세스는 startService() 메소드를 사용해서 시작된 서비스를 실행중이면서, 포그라운드 프로세스와 비지블 프로세스에 속하지 않는 프로세스 입니다.

서비스 프로세스는 사용자에게 보이진 않지만, 사용자에게 영향을 줄 수 있는 ( mp3 재생 등 ) 작업을 하고 있다고 볼 수 있는데요, 따라서 포그라운드 프로세스 및 비지블 프로세스를 유지할 메모리가 없지 않은 이상에는 강제종료 되진 않겠지요.



4. 백그라운드 ( background ) 프로세스

백그라운드 프로세스는 사용자의 눈에 보이지 않는 액티비티를 가진 프로세스 입니다. 이것은 사용자에게 직접적인 영향을 주지 않고, 포그라운드 -> 비지블 -> 서비스 프로세스 유지를 위해 언제든지 강제종료 될 수가 있습니다.

이런 이유로, 가장 최근에 사용자에게 보여진 액티비티를 가진 프로세스가 가장 나중에 종료될 수 있도록 LRU(Least Recently Used : 가장 최근에 적게 사용되는) 라는 목록으로 관리됩니다.

이것은 오래된 보여지지 않는 액티비티의 강제종료가 사용자에게 별다른 영향을 주지 않는다고 생각하는 것이지요.



5. empty 프로세스

empty 프로세스는 활성화된 것들을 보유하지 않은 프로세스입니다.
이 프로세스는 캐쉬 역할을 제외하면 하는것이 없기 때문에 강제종료 됩니다.
(즉, 중요성이 가장 낮습니다)





추가적으로, 프로세스의 중요도는 다른 프로레스에 의해 높아질 수 있습니다.
다른 프로세스를 지원하는 프로세스는 지원하는 프로세스보다 낮은 중요도를 가지면 안되겠지요.

예를들어 "A" 프로세스에 있는 서비스가 "B"에 연결되어 있다면 "A"와 "B"는 같은 중요도를 가져야 합니다.


서비스 프로세스가 백그라운드 프로세스보다 중요도가 높기 때문에 오래걸리는 작업처리는 별도의 스레드에 할당하기 보단 서비스를 이용하여 처리하는것이 좋겠네요. 서비스를 이용하면 액티비티와는 무관하게 최소한 '서비스 프로세스' 우선 순위는 보장된다는 뜻이니까요.
때문에 오래걸리는 작업처리 ( 네트워크 다운/업로드 등 ) 는 스레드보다 서비스로 구현해야 하는 이유가 됩니다.




반응형

댓글

Designed by JB FACTORY