2013-02-20 4 views
4

Для связи между приложением и службой, почему я использую Bound службу, а не отправлять данные в Intent:Почему я должен использовать Bound Service?

mServiceIntent = new Intent(getActivity(), RSSPullService.class); 
mServiceIntent.setData(Uri.parse(dataUrl)); 

я прочитал, что «Если служба уже запущена, она будет называться с onStartCommand(), чтобы выполнить новое намерение, но вторая копия не создается ». Это означает, что я мог бы посылать сообщения в этом намерении повлиять на прогресс на службу, это то, что делается в примере Google RandomMusicPlayer:

public void onClick(View target) { 
    // Send the correct intent to the MusicService, according to the 
    // button that was clicked 
    if (target == mPlayButton) 
     startService(new Intent(MusicService.ACTION_PLAY)); 
    else if (target == mPauseButton) 
     startService(new Intent(MusicService.ACTION_PAUSE)); 
    else if (target == mSkipButton) 
     startService(new Intent(MusicService.ACTION_SKIP)); 
    else if (target == mRewindButton) 
     startService(new Intent(MusicService.ACTION_REWIND)); 
    else if (target == mStopButton) 
     startService(new Intent(MusicService.ACTION_STOP)); 
    else if (target == mEjectButton) { 
     showUrlDialog(); 
} 

ответ

0

Есть целый ряд причин для привязки к службе, в отличии от его отправки асинхронные сообщения. Одна из важных причин заключается в том, что он дает вам больше контроля за временем жизни службы. Если вы просто отправляете намерения, которые обрабатываются службой, служба может уйти - потерять любое внутреннее состояние - между сообщениями. Связанные службы получают специальное лечение, когда Android ищет ресурсы, которые могут быть освобождены.

Другая, несвязанная причина, если вы являетесь связующим звеном в обслуживании в процессе, вы можете передать IBinder известному классу и вызвать методы на нем напрямую. Это обеспечивает очень богатый (хотя и тесно связанный) интерфейс с сервисом. Было бы сложно имитировать это богатое взаимодействие, используя передачу сообщений через Intents.

+0

«Если вы просто отправляете намерения, которые обрабатываются службой, служба может уйти - потерять любое внутреннее состояние - между сообщениями». Я не уверен, что это правда, в документации говорится: «Android система будет пытаться сохранить процесс, обслуживающий службу, до тех пор, пока служба была запущена ИЛИ у нее есть клиенты, привязанные к ней ». – serenskye

+0

Также см. этот [post] (http://stackoverflow.com/questions/5388915/can-started- and-bound-services-live-forever? rq = 1), что объясняет это красиво – serenskye

+0

@serenskye: Служба всегда имеет право на сбор мусора. Однако, если он связан, гораздо меньше шансов быть собранным мусором, чем если бы он работал, потому что он был запущен в какой-то момент в прошлом. –

Смежные вопросы