2012년 5월 19일

<서비스> bindService() flag??



BIND_AUTO_CREATE 플래그는  
bindService() 호출에 의한 바인딩이 존재하는 동안
그것의 대상이 되는 Service를 자동으로 생성합니다. 

이 플래그가 Service를 자동 생성하게끔은 하지만, 
즉 Service의 onCreate() 콜백메쏘드가 호출되게끔 하지만, 
Service의 onStartCommand() 콜백 메쏘드는 
여전히 startService()를 통한 명시적 호출에 의해서만 호출됩니다.

그리고 이 플래그를 사용하지 않아도(즉 플래그를 0으로 설정해도)
일단 bindService()를 호출해 놓으면, 
추후에 그것의 대상 Service가 생성될 때 bind 커넥션이 확립되고 
Service 내에 구현되어 있는 Bind Object 내의 메쏘드들을 호출할 수 있습니다.

이 플래그를 지정하는 것은, 시스템에게 bindService()를 호출한 프로세스 만큼 
중요하게, 그것의 대상이 되는 Service를 취급할 것을 지시하는 의미를 갖습니다. 
즉, 메모리가 부족해서 메모리를 확보하기 위해 제거할 프로세스를 선택할 때, 
그 Service에 바인드되어 있는 프로세스를 제거해야 하는 상황이 될 때에만 
해당 서비스도 제거될 수 있도록 설정하는 의미를 갖습니다.

이것은 안드로이드의 LowMemoryKiller의 작동메커니즘과 관련되어 있습니다.
예를 들어, bindService()가 Foreground Activity에서 호출되었다고 가정할 때,
이 컴포넌트를 보유한 프로세스는 Foreground Activity를 보유하고 있기 때문에
가장 높은 중요도로 관리됩니다. 
하지만 일반적으로 그것의 대상이 되는 Service를 보유한 프로세스의 중요도는 
Foreground Activity를 보유한 프로세스 만큼 중요하게 관리되지 않습니다.

하지만 이 플래그를 사용하게 되면  Service를 보유한 프로세스 역시 
bindService()를 호출한 프로세스와 동일한 중요도로 시스템에 의해 관리됩니다.

이것은 메모리가 부족한 상황에서 반복적으로 Service가 제거되었다가 다시 생성되는
상황을 방지하게 됩니다.

댓글 없음:

댓글 쓰기