Как это возможно? Сервис работает неограниченно, а также разрешает привязку к андроиду?
Мне нужна служба, которая может работать в фоновом режиме до тех пор, пока я не остановлюсь, даже если компонент, который начал ее, будет уничтожен, а также позволит привязать к действию. Как это возможно?
В соответствии с документом связанных сервисов, связанных с orroid, существует три способа создания связанного сервиса
- Расширение класса Binder.
- Использование Messenger.
- Использование AIDL.
Я создал связанную службу с помощью мессенджера (2-й метод). Активность связывается с сервисом в его методе onStart() и отвязывается в методе onStop(). Двухсторонняя передача сообщений (между активностью и сервисом) работает правильно. Но проблема в том, что когда действие отвлекает сервис, служба уничтожается. Но я хочу службу, которая может работать бесконечно.
Возможно, как android Руководство для разработчиков служб - "Хотя эта документация обычно обсуждает эти два типа услуг отдельно, ваша служба может работать в обоих направлениях - она может быть запущена (для запуска на неопределенный срок), а также разрешить привязку. Это просто вопрос о том, реализуете ли вы несколько методов обратного вызова: onStartCommand(), чтобы позволить компонентам запускать его и onBind(), чтобы разрешить привязку."
Я также реализую метод onStartCommand() в сервисе и возвращаю START_STICKY, но он никогда не вызывается. Рассматривая обратные вызовы с ограниченным сроком службы в dev-руководстве, не существует метода обратного вызова onStartCommand(). Тогда как можно запустить сервис до тех пор, пока мы не остановимся и не разрешим привязку?
Я использую платформу eclipse в Fedora 15 OS.
Любая помощь.....
Ответы
Ответ 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
Ответ 5
Если вы добавите "Ongoing Notification"
в ящик приложения Android, ваше приложение и служба не будут убиты.
Отъезд http://developer.android.com/guide/topics/ui/notifiers/notifications.html
Ответ 6
Вы можете использовать привязку службы и создать один экземпляр соединения на уровне экземпляра приложения, в onCreate of the App это будет поддерживать работу службы. Сервис должен быть приоритетным