Нужно ли вызывать как unbindService, так и stopService для служб Android? - PullRequest
17 голосов
/ 02 августа 2010

В моем приложении для Android я звоню startService и bindService:

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. Похоже, что это не так.

Ответы [ 3 ]

26 голосов
/ 20 февраля 2011

Документация Android для stopService () гласит:

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

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

8 голосов
/ 20 апреля 2011

Я поймал эту ошибку:

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

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

Затем, чтобы снять привязку, просто:

unbindService(...);

Решение проблемы связывания и снятия привязки в одном и том же контексте решило проблему.

5 голосов
/ 02 августа 2010

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

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

...