Нужно ли мне звонить обеим службам unbindService и stopService для Android?

В моем приложении для 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. Однако, похоже, это не так.

Ответы

Ответ 1

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

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

Так что вызов stopService(), за которым следует unbindService(), должен работать (он работает для меня).

Ответ 2

У меня получилось:

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

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

Затем, чтобы развязать его, просто:

unbindService(...);

Убедившись, что и bind, и unbind использовали тот же контекст, решили проблему.

Ответ 3

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

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