본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Service 고급정보.

by 돼지왕 왕돼지 2012. 5. 21.
반응형

http://developer.android.com/guide/topics/fundamentals/services.html 

- Service 는 특별히 명시하지 않는 한 Main Process 의 Main Thread 에서 돌기 때문에 Service 내에서 thread 관리를 해주어야 함.

- Service 는 할 일이 끝나면, stopSelf() 나 stopService() 를 통해 종료를 해주어야 한다. ( bind 시에는 고려대상이 아니다. )

- 안드로이드 시스템에 메모리가 부족할 경우, Service 를 죽일 수 있다. 현재 user focus 를 가진 activity 가 이 service 와 연결되어 있다면, 죽을 확률은 현저히 떨어지고, 만약 service 가  run in foreground 로 설정되어 있다면, 죽을 확률은 거의 없다고 보면 된다.

- 시스템이 메모리 등의 이유로 service 를 kill 시켰다면, resource 가 available 해졌을 때 자동으로 service 가 재시작된다.( 물론 이동작은 onStartCommand 의 return value 에 따라 다르다. )
 
- IntentService 는 Service 의 subclass 로 일반 Service 와 달리 worker thread 를 이용하여 reqeust 를 handle 한다. 이것은 동시에 여러 요청을 처리할 필요가 없을 때 best option이 된다. IntentService는 각 요청마다 onHandleIntent() 가 들어온다.

- IntentService 는 request 를 queue 를 해줘서 worker thread 에서 일을 처리는 하돼, 한번에 하나씩만 처리하도록 한다. 만약에 모든 request 가 다 처리되면 알아서 종료되기 때문에 stopSelf() 를 호출해줄 필요가 없다. 나머지도 기본구현이 되어있기 때문에 결국 신경써줘야 하는건 onHandleIntent() 뿐이다.

- onStartCommand() 는 3가지의 return type 이 있다.

 START_NOT_STICKY 

system 이 service 를 죽였을 때, pending intent 가 없는 한 service 를 다시 실행시키지 않는다. 가장 safe 한 return type 이다.
 

 START_STICKY 

system 이 onStartCommand()가 return 한 후 service 를 죽였다면, service 를 다시 create 하면서 onStartCommand() 를 부른다. 하지만 last intent 를 다시 전달하지는 않는다. pending intent 가 없다면 null intent 가 전달된다. MediaPlayer 와 같이 자기 일을 묵묵히 하고 request 가 간혹 들어오는 type 의 service 에 더욱 적합하다.
 

 START_REDELIVER_INTENT 

system 이 service 를 죽였을 때 서비스를 다시 만들고 onStartCommand() 를 부르는데, 이 녀석은 last intent 를 전달받는다. 그 다음에 pending intent 가 있다면 추후에 전달된다. downloading 같은 즉각적인 resume 이 필요한 service 에 적합하다.

 



- Service 의 처리 결과를 받고 싶다면(bind 없이), client 에서 getBroadcast() 를 통해 braodcast PendingIntent 를 만든 다음에 service 구동 intent 에 함께 싣어보내고 service에서 해당 pending intent의 broadcast 를 통해 결과를 전달하는 구현을 해준다. ( PendingIntent 는 parcelable 로 전달한다.)

- startService 는 여러번 불릴 수 있지만, stopSelf() 나 stopService() 는 한번만 호출되도 service 를 stop 시킬 수 있다. 이 경우 multi request 를 handle 할경우 문제가 될 수 있다. 그래서 stopSelf( int reqeustID ) 가 제공되며, 가장 최근에 받은 request의 requestID 과 stopSelf에 전달되는 requestID 가 일치할 때만, 이 call 이 유효하게 된다.

- Foreground service 의 경우 반드시 noficiation 을 제공해야 한다. Foreground service 는 보통 Music Player 와 같이 interactive 한 service 에 사용한다. foreground 는 startForeground() 로 시작시킨다. 이 때 Notification ID 와 notification을 함께 전달한다. parameter로 stopForeground() 로 stop 시키는데 parameter 로 notification 도 함께 제거할지를 boolean 값으로 넘기게 된다.








반응형

댓글