2011-09-03 2 views
35

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

В соответствии с документом андроид связаны услуг - есть три способа создания Услуга ограничения

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

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

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

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

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

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

+5

«Я хочу, чтобы сервис, который может работать в фоновом режиме на неопределенный срок» - это невозможно. Пользователь убьет вашу услугу, если почувствует, что вы тратите впустую свои ресурсы устройств без постоянной доставки. ОС будет убивать вашу службу, если она чувствует, что она работает слишком долго. Я бы предположил, что менее 0,1% приложений для Android нуждаются в вечном сервисе. Убедите нас, что вашему приложению действительно нужен сервис, который работает все время. – CommonsWare

+1

Я хочу службу, которая начинается, когда мое приложение запускается и может запускаться до тех пор, пока пользователь не выберет выход из меню опций в моем приложении, или пользователь или ОС не убьет его.Проблема заключается в том, что пользователь запускает мое приложение, поэтому моя служба запускается (я использую связанный сервис, потому что я хочу общаться с действиями и услугами с помощью мессенджера), но он уничтожается, когда пользователь нажимает обратно и выходит на главный экран, потому что моя деятельность отвязана его метод onStop(), и когда вся деятельность отключает мой сервис, я не хочу, потому что я слушаю SIP-сообщения, исходящие из фона и в соответствии с активностью обновления сообщения при его запуске. –

+0

Почему вы хотите, чтобы он бежал бесконечно? Какую вещь вы хотите всегда выполнять? –

ответ

43

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

Из Service documentation, курсива:

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

Как указывали другие, он может быть убит Android, если нужны ресурсы. Вы можете «расставить приоритеты» своего Сервиса и сделать его менее вероятным, если его сделать foreground service.

+2

@ Khushbu: Это правильный ответ. –

+2

Это (по крайней мере) не всегда верно. Я начал службу, используя startService, а затем привязался к ней. Когда последнее связующее вещество освобождает привязку, служба уничтожается. Услуга работает в отдельном процессе. – Harmen

5

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

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

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

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

Однако, если до bindService линии, я также явно запустить службу с

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

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

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

+0

Я не очень-то знаю о удаленной службе (интерфейс AIDL). Можете ли вы объяснить, почему и где он используется? Я прочитал документ для Android, и я обнаружил, что «использование AIDL необходимо, только если вы разрешаете клиентам из разных приложений получать доступ к вашей службе для IPC и хотите обрабатывать многопоточность в вашем сервисе». Поэтому я думаю, что мне это не нужно. В моем приложении я слушаю сообщения SIP и согласно этому обновлению ui и посылаю ответ. Я запутался в AIDL. Можете ли вы дать свое предложение? –

+0

@ Khushbu - Я использовал только удаленный сервис и AIDL, потому что я хотел получить сервис в отдельном apk из основного приложения. В вашем случае вы можете использовать как bindService, так и startService для локальной службы. – NickT

3

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

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

2

Для того, чтобы осуществлять связь между службы и деятельности. Вы можете также использовать 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

 Смежные вопросы

  • Нет связанных вопросов^_^