Android — Не разрешено запускать намерение службы из JobIntentService: приложение работает в фоновом режиме

#java #android

#ява #Android #java

Вопрос:

Я получаю намерения в BroadcastReceiver и пытаюсь запустить службу.

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

 public class JsInvokerJobService extends JobIntentService {

    ...
    @Override
    protected void onHandleWork(Intent intent) {
        // We have received work to do.  The system or framework is already
        // holding a wake lock for us at this point, so we can just go.
        Log.i(TAG, "Executing work: "   intent);
        this.startService(intent);
        Log.i(TAG, "Finished work: "   intent);
    }
  

тем не менее, это по-прежнему приводит к сбою моего приложения в фоновом режиме с ошибкой:

Not allowed to start service Intent app is in background

Я читал об использовании Runnable для этих случаев, но я не могу понять, как передать мой контекст в Runnable:

     final Handler mHandler = new Handler();
    
    @Override
    protected void onHandleWork(Intent intent) {
        // We have received work to do.  The system or framework is already
        // holding a wake lock for us at this point, so we can just go.
        Log.i(TAG, "Executing work: "   intent);
        mHandler.post(new Runnable() {
            @Override public void run() {
                this.startService(intent);
            }
        });
        Log.i(TAG, "Finished work: "   intent);
    }
  

как мне получить доступ к контексту (очевидно, this больше не будет работать)? и как мне передать намерение?

И сработает ли это в любом случае? Или для этого есть другой метод?

Комментарии:

1. Почему вы хотите запустить службу из onHandleWork() ? Выполняйте свою работу в onHandlework() самостоятельно.

2. Я работаю с React Native, и мне нужно запустить безголовую задачу JS, которая выполняла бы много логики (доступ к локальному хранилищу, выполнение некоторых сетевых вызовов и т.д.). Насколько я понимаю, это можно было сделать только с помощью обычного сервиса. смотрите reactnative.dev/docs/headless-js-android