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

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

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

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

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

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

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

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

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

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

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

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

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

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

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