Нужно ли мне звонить обеим службам 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(), то услуга разрешается останавливать в любое время.