Нужно ли вызывать как 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 andstopService`:

unbindService(conn);
stopService(intent);

Однако я получаю исключение при вызове unbindService. Если я удалю этот вызов, приложение, похоже, будет правильно работать через вызов stopService.

Я делаю что-то неправильно? Я думал, что вызов bindService должен быть связан с вызовом unbindService, а вызов startService должен быть связан с вызовом stopService. Однако здесь, похоже, это не так.


person Matt Huggins    schedule 02.08.2010    source источник
comment
Вы когда-нибудь догадывались об этом? Я столкнулся с тем же самым и закомментировал unbindService(conn) для себя. Вроде все работает, но, как и у тебя, мое чутье подсказывает, что что-то на заднем фоне не понравится.   -  person David Liu    schedule 16.12.2010


Ответы (4)


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

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

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

person Mike Lowery    schedule 20.02.2011
comment
Ааа, похоже, мой порядок unbindService и stopService был обратным, я вижу. - person Matt Huggins; 21.02.2011
comment
Спасибо, это помогло мне! Я использовал BIND_AUTO_CREATE, и unbindService() помог решить проблему с утечкой ServiceConnection. - person lomza; 30.01.2013
comment
@ Мэтт Хаггинс, значит, вы, ребята, хотите сначала развязаться, а затем остановиться, не так ли? - person Mr.Noob; 19.11.2014
comment
У меня работает сначала вызов stopService, а затем unbindService. - person chengsam; 13.10.2016
comment
the service runs until the service stops itself with stopSelf() or another component calls stopService(), regardless of whether it is bound to any clients. developer.android.com/guide/components/bound-services#Lifecycle - person xuiqzy; 18.09.2020

Попался, что я ударил с этим:

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

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

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

unbindService(...);

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

person rmc47    schedule 20.04.2011

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

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

person RoflcoptrException    schedule 02.08.2010
comment
Спасибо, но я был там, и не ясно, нужно ли мне одновременно отвязывать и останавливать службу, если я запустил ее вручную перед привязкой к ней с флагом BIND_AUTO_CREATE. - person Matt Huggins; 05.08.2010
comment
But it's importatnt to note, that if you call unBind(), then the service is allowed to stop at any time. — Нет, если запущен, то не остановится до вызова stopSelf или stopService: the service runs until the service stops itself with stopSelf() or another component calls stopService(), regardless of whether it is bound to any clients. developer.android.com/guide/components/bound-services#Lifecycle - person xuiqzy; 18.09.2020

Чтобы ответить на ваш вопрос напрямую, можно не вызывать unbindservice, НО это не рекомендуется. Что происходит, если ваша служба не является службой переднего плана, система Android может убить ее, чтобы освободить память. И если есть еще какой-то компонент, привязанный к нему, но вы не вызвали unbind, он будет отвязан системой Android.

См. документацию по Android здесь

https://developer.android.com/guide/components/bound-services

Если ваш клиент все еще привязан к службе, когда ваше приложение уничтожает клиент, уничтожение приводит к тому, что клиент отсоединяется. Лучше отвязать клиента, как только он завершит взаимодействие со службой. Это позволяет отключить бездействующую службу. Дополнительные сведения о подходящем времени для привязки и отмены привязки см. в разделе Дополнительные примечания.

person Bqin1    schedule 01.08.2019
comment
Приведенная документация, по-видимому, касается случаев, когда служба не будет остановлена, когда это возможно (потому что она не нужна), но если вы остановите службу, это уже не кажется таким ясным, если вы должны и можете также отвязаться . - person xuiqzy; 18.09.2020
comment
the service runs until the service stops itself with stopSelf() or another component calls stopService(), regardless of whether it is bound to any clients. developer.android.com/guide/components/bound-services#Lifecycle - person xuiqzy; 18.09.2020