Подтвердить что ты не робот

OnServiceDisconnected() не вызывается после вызова службы stopSelf()

У меня есть Activity, в котором я запускаю и привязываюсь к загрузке Service.

При вызове stopSelf() в Service, onServiceDisconnected() в Activity не вызывается.

Я ожидаю, что он будет вызываться, поскольку, если Service остановлен, все связанные действия должны быть несвязаны.

Что мне не хватает?

4b9b3361

Ответ 1

Согласно официальному документу, onServiceDisconnected() будет вызываться, если служба разбилась или была убита. Ссылка http://developer.android.com/reference/android/content/ServiceConnection.html

Вызывается, когда соединение с Сервисом потеряно. Обычно это происходит, когда процесс, на котором выполняется служба, разбился или был убит. Это не приведет к удалению самого ServiceConnection - эта привязка к службе останется активной, и вы получите вызов onServiceConnected (ComponentName, IBinder), когда служба будет запущена.

Ответ 2

Просто отправка уведомления связанному клиенту и вызов stopSelf() (или stopService()) фактически не будут выполнять то, что вы пытаетесь сделать. Вы должны вызвать unbindService() в связанном клиенте (и служба не должна иметь других связанных клиентов), чтобы фактически уничтожить службу.

Существует два типа Услуг, "запущенные" службы и "связанные" сервисы. Они не являются взаимоисключающими. Если вы запустили службу с помощью startService(), у вас есть служба "запущена". Если вы запустите услугу через bindService(), она привязана. Если вы связываетесь с сервисом, а также используете startService(), это и то, и другое. Таким образом, существует три возможных варианта управления жизненным циклом службы:

1) Начальная служба: вы вызываете startService(), чтобы запустить его; сервис будет остановлен только вызовом stopService() или stopSelf().

2) Связанная служба: вы вызываете bindService() и передаете флаг BIND_AUTO_CREATE. Другие клиенты могут связывать и отвязывать услугу по своему усмотрению, служба будет автоматически уничтожена, когда все клиенты будут отключены. В этом случае вызов stopService() или stopSelf() не имеет эффекта.

3) Комбо: клиенты привязаны к службе, и вы также вызвали startService(). В этом случае вызов stopSelf() или stopService() приведет к уничтожению службы только после отсоединения всех клиентов. Аналогично, служба не будет автоматически уничтожена, когда все клиенты отделились, до тех пор, пока не будут вызваны stopSelf() или stopService().

В документации по жизненному циклу для комбинированных служб говорится:

Эти два пути не являются полностью отдельными. То есть вы можете привязываться к который уже был запущен с помощью startService(). Например, услугу фоновой музыки можно запустить, позвонив startService()с намерением, который определяет музыку для воспроизведения. Позже, возможно, когда пользователь хочет получить определенный контроль над игроком или получить информация о текущей песне, действие может связываться с вызовите bindService(). В таких случаях, stopService() или stopSelf() фактически не останавливает службу пока все клиенты не отвяжутся.

Итак, в вашем случае у вас есть связанный клиент. Вызов stopSelf() не принудительно отключает связанные клиенты, поэтому вы должны явно сообщить клиенту, что служба хочет завершить работу, а затем ваш клиент должен вызвать unbindService() до того, как служба будет уничтожена. Вы можете выполнить это различными способами, проще всего через широковещательный или интерфейс IBinder или мессенджер или AIDL, если вы общаетесь со службой через процессы.