Как это возможно, что служба работает бесконечно, а также разрешить привязку в Android? - PullRequest
37 голосов
/ 03 сентября 2011

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

Согласно документу для связанных служб Android - существует три способа создания связанной службы

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

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

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

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

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

Любая справка .....

Ответы [ 6 ]

47 голосов
/ 07 сентября 2011

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

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

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

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

6 голосов
/ 07 сентября 2011

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

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

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

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

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

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

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

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

3 голосов
/ 08 сентября 2011

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

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

2 голосов
/ 02 мая 2016

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

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

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

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

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

https://github.com/shanrais/BothService

1 голос
/ 13 сентября 2011

Если вы добавите "Ongoing Notification" в Android App Drawer, ваше приложение и служба не будут уничтожены.

Выезд http://developer.android.com/guide/topics/ui/notifiers/notifications.html

0 голосов
/ 13 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...