startService() выдает java.lang.IllegalStateException

Из onCreate() моих действий,

Я пытаюсь запустить службу с помощью следующего кода:

Intent intent = new Intent();
intent.setClassName(SERVICE_PKG_NAME, SERVICE_NAME);
context.startService(intent); //context = MainActivity.this

Однако я получаю следующее исключение:

java.lang.IllegalStateException: не разрешено запускать службу Намерение (имя службы): приложение находится в фоновом режиме

Любая идея, что может быть причиной этого? Застрял на нем уже несколько часов.


person Sahil Mehta    schedule 01.06.2017    source источник
comment
На какой версии Android вы тестируете? Кроме того, можете ли вы опубликовать всю трассировку стека Java?   -  person CommonsWare    schedule 01.06.2017
comment
Это работает с getApplicationContext().startService(intent)?   -  person tynn    schedule 01.06.2017
comment
@tynn Не пробовал .. все та же ошибка ..   -  person Sahil Mehta    schedule 02.06.2017
comment
@CommonsWare Android -O. Из developer.android.com/preview/behavior-changes.html кажется новым добавлен. жирный Метод startService() теперь генерирует исключение IllegalStateException, если приложение, предназначенное для Android O, пытается использовать этот метод в ситуации, когда ему не разрешено создавать фоновые службы.**жирный**   -  person Sahil Mehta    schedule 02.06.2017
comment
Ваше сообщение об ошибке соответствовало тому, что я видел от O, поэтому я спрашивал о версии устройства. Где и когда вы пытаетесь запустить службу?   -  person CommonsWare    schedule 02.06.2017
comment
@CommonsWare Сценарий проблемы: Мое приложение A пытается запустить службу и привязаться к ней (приложения B). Однако приложение B находится в фоновом режиме, а приложение A — на переднем плане, поэтому система не позволяет запускать службу для приложения в фоновом режиме. Решение Можно исправить, запустив службу приложения B при загрузке (путем прослушивания завершения загрузки приемника). Затем приложение А может успешно выполнить привязку. Конечно, ограничением этого решения является запуск службы при загрузке, а не тогда, когда это необходимо. Любые другие предложения по обходу этого ограничения   -  person Sahil Mehta    schedule 02.06.2017
comment
поэтому система не позволит запустить службу для приложения в фоновом режиме - это не имеет никакого смысла. Приложение A находится на переднем плане. Предполагается, что он может запускать службы в полном объеме, включая любые службы приложения B. Несмотря на это, сначала попробуйте выполнить привязку к службе, а затем вызвать startService() для этой же службы, как только служба будет привязана.   -  person CommonsWare    schedule 02.06.2017
comment
@CommonsWare да, ваше предложение отлично работает. Сначала вызовите только bindService(), после OnServiceConnected() из-за вызова привязки вызовите StartService(). Не могли бы вы объяснить, почему эта последовательность работает нормально, а исходная - нет?   -  person Sahil Mehta    schedule 05.06.2017
comment
Возможно, это баг в Android O. Иначе, учитывая ваше описание симптомов, я понятия не имею, почему он так себя ведет.   -  person CommonsWare    schedule 05.06.2017
comment
@CommonsWare Мне удалось решить эту проблему, как я упоминал ранее, вызвав bindService(), а затем startService(). Однако это было применимо только тогда, когда приложение A было на переднем плане. Теперь у меня есть еще один сценарий, в котором приложение C (фоновая служба) хочет запустить службу startService() приложения B, но падает даже при вызове startService() из onServiceConnected() [из bindService]. Любые предложения для этого сценария?   -  person Sahil Mehta    schedule 17.07.2017
comment
Возможно, A, B и C должны быть одним приложением. В любом случае, вы можете попробовать позвонить startForegroundService() на Context вместо startService().   -  person CommonsWare    schedule 17.07.2017
comment
если вы используете IntentService, переключение на JobIntentService должно помочь. Под капотом используется JobScheduler для устройств с O+ и IntentService для старых API.   -  person cwiesner    schedule 06.04.2018
comment
@SahilMehta: попробуйте этот stackoverflow.com/questions/46445265/   -  person Anand Savjani    schedule 18.06.2018


Ответы (1)


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

  • сначала вызовите bindService()
  • после OnServiceConnected() из-за вызова привязки
  • вызвать СтартСервис().
person Sahil Mehta    schedule 07.06.2017
comment
Значит, это должен быть связанный сервис? - person IgorGanapolsky; 27.07.2017
comment
Итак, как мне запустить службу в ответ на уведомление Firebase? - person Daniel F; 28.08.2017
comment
@DanielF Я думаю, что для этого лучше использовать JobScheduler. Вы можете указать задание, которое будет запущено для него, на основе определенных условий, таких как зарядное устройство подключено и т. д. developer.android.com/reference/android/app/job/ - person Sahil Mehta; 29.08.2017
comment
@SahilMehta Спасибо за ваш отзыв. Моя проблема заключалась в том, что я начал ориентироваться на API 26, и там вы не можете вызывать службу из фона, если вы не делаете это с помощью startForegroundService (я думаю, это было имя), тогда вам нужно передать ему уведомление. - person Daniel F; 29.08.2017
comment
@DanielF, я думаю, JobScheduler должен помочь в этом случае. У меня был похожий сценарий. - person Sahil Mehta; 04.09.2017