2010-08-02 1 views
15

В моей Android приложение, я называю как startService и bindService:Нужно ли мне звонить обеим службам unbindService и stopService для Android?

Intent intent = new Intent(this, MyService.class); 
ServiceConnection conn = new ServiceConnection() { ... } 

startService(intent) 
bindService(intent, conn, BIND_AUTO_CREATE); 

Позже, я пытаюсь как unbindService and stopService`:

unbindService(conn); 
stopService(intent); 

Однако я получаю исключение при вызове unbindService. Если я удалю этот вызов, приложение, похоже, работает правильно через вызов stopService.

Я что-то не так? Я думал, что вызов bindService должен быть связан с вызовом unbindService, а вызов startService должен быть связан с вызовом stopService. Однако, похоже, это не так.

+0

Вы когда-нибудь это выясняли? Я столкнулся с одним и тем же, и прокомментировал unbindService (conn) для себя. Кажется, все в порядке, но, как и вы, моя кишка говорит, что что-то на заднем плане не понравится. –

ответ

24

Андроида документация StopService() гласит:

Обратите внимание, что если остановленная служба до сих пор объектов ServiceConnection присоединенных к нему с набором BIND_AUTO_CREATE, он не будет уничтожен, пока все эти привязки не будут удалены. Дополнительную информацию о жизненном цикле службы см. В документации по сервису.

Поэтому необходимо позвонить stopService(), а затем unbindService() (он работает для меня).

+1

Ahh, похоже, мой заказ «unbindService» и «stopService» были обратными, я вижу. –

+0

Спасибо, это помогло мне! Я использовал BIND_AUTO_CREATE и unbindService() помог решить проблему с утечкой ServiceConnection. – lomza

+0

@ Matt Huggins, так что вы, ребята, хотите сначала развязать, а потом остановиться? –

5

Как вы можете видеть here, это зависит от того, чего вы хотите достичь и как вы привязываете услугу. Если вы хотите иметь длинную ссылку на услугу, лучше использовать bindService, чем startService. Если в методе bindService используется флаг BIND_AUTO_CREATE, то вам не нужно вызывать startService, потому что служба запускается сама по себе, когда это необходимо.

Если вы вызываете службу unBind, то вы удаляете службу. Вам не нужно явно останавливать службу, но вы можете. Но важно помнить, что если вы вызываете unBind(), то услуге разрешается останавливаться в любое время.

+1

Спасибо, но я был там, и неясно, нужно ли мне отменить и остановить службу, если я вручную запустил ее перед привязкой к ней с помощью флага BIND_AUTO_CREATE. –

8

Гоча, что я ударил с этим:

Убедитесь, что вы звоните unbindService на том же контексте, что вы назвали bindService. В моем случае, я делаю следующее, чтобы связать его:

Context c = getApplicationContext(); 
c.bindService(...); 

Тогда отвязать его, просто:

unbindService(...); 

Удостоверяясь как связываются и UNBIND использовали тот же контекст, решить эту проблему.

+1

спасибо - только что с этим справились – SteelBytes

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

  • Нет связанных вопросов^_^