Ошибка при запуске службы в BroadcastReceiver - PullRequest
1 голос
/ 19 июня 2019

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

Но в документах четко указано:

Состояние вашего BroadcastReceiver (независимо от того, запущен он или нет) влияет на состояние его содержащего процесса, что, в свою очередь, может повлиять на его вероятностьбыть убитым системой.Например, когда процесс выполняет приемник (то есть в настоящее время выполняет код в своем методе onReceive ()), он считается процессом переднего плана .Система поддерживает выполнение процесса, за исключением случаев экстремального давления памяти.

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

Так что же такоепроблема здесь?

@Override
public void onReceive(Context context, Intent intent) {
    // assumes WordService is a registered service


    context.startService(new Intent(context, HelloService.class));

}

Ошибка:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.testapp, PID: 26026
    java.lang.RuntimeException: Unable to start receiver com.example.testapp.MyReceiver: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.testapp/.HelloService }: app is in background uid UidRecord{bee03a7 u0a82 RCVR bg:+1m19s133ms idle change:uncached procs:1 seq(0,0,0)}
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3194)
        at android.app.ActivityThread.-wrap17(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1672)
        at android.os.Handler.dispatchMessage(Handler.java:106)

1 Ответ

1 голос
/ 19 июня 2019

Более подходящая документация для вашей ситуации - в примечаниях к выпуску Android 8.0 .

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

  • Имеет видимое действие, независимо от того, запущено действие или приостановлено.
  • Оноимеет службу переднего плана.
  • Другое приложение переднего плана подключается к приложению либо путем привязки к одной из его служб, либо с использованием одного из его поставщиков контента.Например, приложение находится на переднем плане, если к нему привязано другое приложение:
    • IME
    • Служба обоев
    • Прослушиватель уведомлений
    • Голосовая или текстовая служба

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

(выделение добавлено)

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

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