Как правильно отвязать услуги

У меня есть служба, которая связана с BIND_AUTO_CREATE с моей активностью и запускается с помощью START_STICKY. Я не вызываю startService() явно.

Поскольку метод onDestroy() не всегда вызывается, когда моя активность уничтожается, а метод onStop() нежизнеспособен, поскольку я не хочу, чтобы моя служба останавливалась, когда пользователь просто нажимает кнопку «Домой», я не знаю, когда отвязать мой сервис.

Вот мои вопросы:

  1. Если я хочу, чтобы моя служба работала, когда моя активность активна, и останавливалась, когда моя активность была убита, где я должен отвязать свою службу?

  2. Когда в данный момент вызывается метод onDestroy() и я вызываю unbindService(), метод службы onUnbind() не запускается. Почему?


person Raphael Royer-Rivard    schedule 08.04.2014    source источник
comment
Хороший вопрос. Но действительно ли необходимо привязываться к сервису? Мне очень нравится шаблон IntentService. Там служба отключается, как только завершает свою задачу. Связь осуществляется через Broadcasts и IntentReceivers.   -  person schlingel    schedule 08.04.2014
comment
На самом деле, у меня есть 2 службы, которые используют диспетчер тревог, чтобы просыпаться каждые x секунд для выполнения своей задачи. Думаю, я мог бы просто использовать контекст моей активности вместо использования службы! Если я хорошо понимаю, службы следует использовать только тогда, когда они должны оставаться активными, когда активность уничтожается?   -  person Raphael Royer-Rivard    schedule 08.04.2014
comment
Если у вас есть AlarmManager, вы можете жить без службы, внедрив широковещательный приемник, который будет реагировать на ваши тревоги. Вам может понадобиться услуга, если вы хотите, чтобы какая-то длительная операция (например, синхронизация с сервером, обновление БД) выполнялась без пользовательского интерфейса.   -  person kiruwka    schedule 08.04.2014


Ответы (1)


Я не вызываю startService() явно

В этом случае нет смысла переопределять onStartCommand (и возвращать START_STICKY), так как он не будет вызываться.

1. Если я хочу, чтобы моя служба работала, когда моя активность активна, и останавливалась, когда моя активность была убита, где я должен отвязать свою службу?

если вы не хотите делать это в onPause, вы можете отменить привязку в onDestroy, это нормально. В редких случаях, когда ваша активность будет уничтожена без onDestroy, она будет развязана Android (поэтому ваш сервис также будет развязан и уничтожен должным образом), как указано здесь :

Когда ваш клиент будет уничтожен, он отвяжется от сервиса

Что касается

2. Когда в данный момент вызывается метод onDestroy() и я вызываю unbindService(), метод службы onUnbind() не запускается. Почему?

Я предлагаю вам привязать к нему кого-то еще, иначе следует вызвать onUnbind. Попробуйте поставить точку останова в этом методе и убедитесь, что он срабатывает. Кроме того, убедитесь, что в этой ситуации вызывается ваша служба onDestroy.

person kiruwka    schedule 08.04.2014
comment
Команда onStartCommand моей службы вызывается, потому что я явно вызываю ее в методе onServiceConnected() моего ServiceConnection. Я только что прочитал его Javadoc с просьбой не вызывать метод напрямую... Если связанная служба должна автоматически отвязываться при уничтожении ее клиента, я думаю, можно отвязать ее в методе onDestroy. Вы правы, на самом деле у меня есть еще одна служба, связанная с моей первой службой. Я думал, что так будет проще, но, похоже, это усложняет процесс отвязки. - person Raphael Royer-Rivard; 08.04.2014
comment
На самом деле, после дополнительного тестирования я заметил странное поведение своего приложения. Когда я убираю его из списка ранее открытых приложений, вызывается Log.d() метода onDestroy моей Activity, но остальная часть кода внутри — нет. Как будто Android хотел убить мое приложение как можно быстрее. У меня нет времени, чтобы отвязать мои службы (которые оба привязаны к контексту моей деятельности). И, в отличие от источника, который вы указали, мои службы не являются несвязанными, поскольку моя активность уничтожена... Я убедился, что не было вызвано startService, и onStartCommand также не вызывается. - person Raphael Royer-Rivard; 08.04.2014
comment
мои службы не развязаны, так как моя активность уничтожена -> в конечном итоге она будет развязана от убитой активности андроидом, как объясняется в документации, на которую я ссылаюсь. Вы упоминаете, что у вас есть две службы, возможно, одна все еще остается привязанной к ней? И, наконец, можете ли вы подтвердить, что ваш сервис onDestroy был вызван после того, как от него все было отвязано. Я сделал простой тест, и все работает так, как ожидалось. - person kiruwka; 08.04.2014
comment
Кажется, я начинаю понимать, что мои Сервисы были уничтожены (без прохождения их методов onUnbind или onDestroy) и остались живы только их приемники тревожных трансляций. Но поскольку я не могу обнаружить уничтожение своих служб, я не могу отменить повторяющиеся задачи AlarmManager из моих служб. Решение, которое я нашел, заключалось в том, чтобы проверить, жив ли контекст моей активности, и если это не так, я бы отключил приемник тревожной трансляции изнутри самого себя. Я не думаю, что это чистый способ остановить это, я, вероятно, просто не должен использовать службы для этой цели. - person Raphael Royer-Rivard; 08.04.2014