Как возможно, что служба будет работать бесконечно, а также разрешить привязку в Android?

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

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

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

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

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

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

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

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


person Khushbu Shah    schedule 03.09.2011    source источник
comment
Мне нужна служба, которая может работать в фоновом режиме неограниченное время - это невозможно. Пользователь убьет ваш сервис, если почувствует, что вы тратите ресурсы его устройства, не принося непрерывной ценности. ОС убьет вашу службу, если сочтет, что она работает слишком долго. Я предполагаю, что менее 0,1% приложений Android нуждаются в постоянном обслуживании. Убедите нас, что вашему приложению действительно нужна постоянно работающая служба.   -  person CommonsWare    schedule 03.09.2011
comment
Мне нужна служба, которая запускается при запуске моего приложения и может работать до тех пор, пока пользователь не выберет выход из меню параметров в моем приложении, или пользователь или ОС не убьют ее. Проблема в том, что пользователь запускает мое приложение, поэтому моя служба запускается (я использую связанную службу, потому что Я хочу сообщать о действиях и услугах с помощью мессенджера), но он уничтожается, когда пользователь нажимает назад и переходит на домашний экран, потому что моя активность отменяется в его методе onStop (), и когда все действия отменяют привязку, моя служба уничтожается, чего я не делаю. не хочу, потому что я слушаю сообщения SIP, поступающие из фона и в соответствии с активностью обновления сообщений при его запуске.   -  person Khushbu Shah    schedule 05.09.2011
comment
почему вы хотите, чтобы он работал бесконечно? Что вы хотите, чтобы оно всегда выполнялось?   -  person Sherif elKhatib    schedule 07.09.2011
comment
Ответ: нет ... Я сделал это ... это убивает вашу батарею   -  person Moog    schedule 13.09.2011
comment
Это действительно плохое отношение. Объясните ему, почему это плохая идея, а затем объясните, как это сделать. StackOverflow - это де-факто источник ответов на многие из этих проблем в Интернете, и, хотя у него может не быть действительного случая, другие люди могут. Это не добавляет ценности людям, которые ищут ответ в Интернете.   -  person Hounshell    schedule 25.04.2013


Ответы (6)


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

В служебной документации, акцент мой:

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

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

person Joel F    schedule 07.09.2011
comment
Это (по крайней мере) не всегда так. Я запустил службу с помощью startService, а затем привязался к ней. Когда последнее связующее освобождает привязку, служба завершается. Служба работает в отдельном процессе. - person Harmen; 25.11.2015

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

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

person NickT    schedule 07.09.2011
comment
Я не очень разбираюсь в удаленном обслуживании (интерфейс AIDL). Вы можете объяснить, почему и где это используется? Я прочитал документ Android и обнаружил, что использование AIDL необходимо только в том случае, если вы разрешаете клиентам из разных приложений получать доступ к вашей службе для IPC и хотите обрабатывать многопоточность в своей службе. Так что я думаю, что мне это не нужно. В моем приложении я слушаю сообщения SIP и в соответствии с этим обновлением ui и отправляю ответ. Я сбит с толку насчет AIDL. Вы можете дать свое предложение? - person Khushbu Shah; 14.09.2011
comment
@Khushbu - Я использовал только удаленный сервис и AIDL, потому что мне нужен сервис в отдельном apk от основного приложения. В вашем случае вы все равно можете использовать как bindService, так и startService в локальной службе. - person NickT; 14.09.2011


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

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

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

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

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

https://github.com/shanrais/BothService

person shanraisshan    schedule 02.05.2016

Если вы добавите "Ongoing Notification" в ящик приложений Android, ваше приложение и служба не будут убиты.

Ознакомьтесь с http://developer.android.com/guide/topics/ui/notifiers/notifications.html

person Abhijeet Pathak    schedule 13.09.2011

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

person Qumber Abbas    schedule 13.10.2018