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

Как это возможно? Сервис работает неограниченно, а также разрешает привязку к андроиду?

Мне нужна служба, которая может работать в фоновом режиме до тех пор, пока я не остановлюсь, даже если компонент, который начал ее, будет уничтожен, а также позволит привязать к действию. Как это возможно?

В соответствии с документом связанных сервисов, связанных с orroid, существует три способа создания связанного сервиса

  • Расширение класса Binder.
  • Использование Messenger.
  • Использование AIDL.

Я создал связанную службу с помощью мессенджера (2-й метод). Активность связывается с сервисом в его методе onStart() и отвязывается в методе onStop(). Двухсторонняя передача сообщений (между активностью и сервисом) работает правильно. Но проблема в том, что когда действие отвлекает сервис, служба уничтожается. Но я хочу службу, которая может работать бесконечно.

Возможно, как android Руководство для разработчиков служб - "Хотя эта документация обычно обсуждает эти два типа услуг отдельно, ваша служба может работать в обоих направлениях - она ​​может быть запущена (для запуска на неопределенный срок), а также разрешить привязку. Это просто вопрос о том, реализуете ли вы несколько методов обратного вызова: onStartCommand(), чтобы позволить компонентам запускать его и onBind(), чтобы разрешить привязку."

Я также реализую метод onStartCommand() в сервисе и возвращаю START_STICKY, но он никогда не вызывается. Рассматривая обратные вызовы с ограниченным сроком службы в dev-руководстве, не существует метода обратного вызова onStartCommand(). Тогда как можно запустить сервис до тех пор, пока мы не остановимся и не разрешим привязку?

Я использую платформу eclipse в Fedora 15 OS.

Любая помощь.....

4b9b3361

Ответ 1

Вам просто нужно начать с startService() где-нибудь. Это предотвратит автоматическое его остановку, когда больше нет привязок.

Из Сервисная документация, основное внимание:

Служба может быть запущена и связана с ней. В в таком случае система будет поддерживать обслуживание до тех пор, пока либо он запущен, либо есть одно или несколько подключений к нему. флаг Context.BIND_AUTO_CREATE.

Как отмечали другие, он может быть убит Android, если нужны ресурсы. Вы можете "расставить приоритеты" своего Сервиса и сделать его менее вероятным для убийства, если вы сделаете его

Ответ 2

Я не пользовался услугами службы сообщений, но привязался к удаленной службе с помощью удаленного интерфейса (AIDL). Мои результаты могут быть полезны. Поскольку мои основные действия и службы в настоящее время реализованы, я связываюсь с сервисом, как с кодом типа

mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this,
                Context.BIND_AUTO_CREATE);

Моя активность реализует ServiceConnection

Когда я вызываю unbindService (this), когда действие завершается, то, как вы уже нашли, вызывается метод service onDestroy().

Если, однако, перед линией bindService я также явно запускаю службу с помощью

startService(new Intent("com.mypackage.MyService.SERVICE"));

то unBind не вызывает выполнение функции onDestroy(). По-прежнему необходимо вызвать unbindService в действии onDestroy/Stop, иначе вы будете утечка сервисного соединения.

В моем случае, по-видимому, сервис остается доступным для других приложений для привязки через его удаленный интерфейс.

Ответ 3

Service.onStartCommand обратный вызов будет вызываться только при запуске службы с использованием метода startService. Поскольку @NickT и @JoelF уже указывали вам нужно вызвать startService(), кроме вызова bindService() где-то в вашем клиентском коде (например, в onCreate).

Вы также можете посмотреть на эту (немного старую, но все же полезную) статью: " Двойной срок службы" и попробуйте представить пример автора программы.

Ответ 4

Чтобы выполнить связь между службой и активностью. Вы также можете использовать Binder, как указано в Официальном примере Android

http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Как утверждают официальные андроидные документы http://developer.android.com/guide/components/services.html#StartingAService

Хотя эта документация обычно обсуждает эти два типа услуг отдельно, ваш сервис может работать в обоих направлениях - он может быть запущен (для запуска неограниченно), а также позволяет привязывать. Это просто вопрос о том, реализуете ли вы несколько методов обратного вызова: onStartCommand(), чтобы позволить компонентам запускать его и onBind(), чтобы разрешить привязку.

Этот проект реализует эту смесь обслуживания (BothService) и показывает, как можно Сервис работать неограниченно, а также разрешать привязку к нескольким действиям.

https://github.com/shanrais/BothService

Ответ 6

Вы можете использовать привязку службы и создать один экземпляр соединения на уровне экземпляра приложения, в onCreate of the App это будет поддерживать работу службы. Сервис должен быть приоритетным