Запустите JobIntentService неявно - PullRequest
0 голосов
/ 24 сентября 2018

Как вы знаете, мы запускаем JobIntentService:

JobIntentService.enqueueWork(this,
                        MyJobIntentService.class,
                        JOB_ID, 
                        intent);

. В этом подходе мы ЗНАЕМ , какой сервис мы хотим запустить и передаем его класс методу.
Вот мой вопрос : Есть ли способ запустить службу неявно ?
Зачем мне это нужно? Я занимаюсь разработкой библиотеки, которая иногда должна запускать службу, которую разработчик расширяет, и, очевидно, у меня нет доступа к ней из библиотеки
Что я пробовал? Я реализовал ее с IntentService (используя фильтры намерений)и работал нормально для устройств до O, но для Android Oreo я получаю этот журнал сбоя:

Неустранимое исключение: java.lang.IllegalStateException: Не разрешено запускать службу Intent {act = someAction pkg = somePackage(имеет дополнительные функции)}: приложение находится в фоновом режиме uid UidRecord {de24eda u0a238 RCVR простаивает: 1 сек (0,0,0)}

Итак, я перешел на JobIntentService, теперь проблема в том,что я не могу начать это неявно.
Любое решение или альтернатива будут оцененыованные.

1 Ответ

0 голосов
/ 24 сентября 2018

Что ж, я нашел решение, сначала запросил службу, которую вы ищете, и проверьте, есть ли у вас необходимые разрешения для JobIntentService, затем поставьте в очередь работу:

private final String PERMISSION_BIND_JOB_SERVICE = "android.permission.BIND_JOB_SERVICE";
Intent handlerIntent = new Intent(MY_ACTION);
List<ResolveInfo> result =
        getPackageManager().queryIntentServices(handlerIntent, 0);
            if (result.size() > 0) {
    ResolveInfo info = result.get(0);
    if (info != null && info.serviceInfo != null &&
            info.serviceInfo.permission != null){
        String permission = info.serviceInfo.permission;
        if (permission.equals(PERMISSION_BIND_JOB_SERVICE)) {
            try {
                Class<?> serviceClass = Class.forName(info.serviceInfo.name);
                JobIntentService.enqueueWork(this,
                        serviceClass,
                        JOB_ID, handlerIntent);

            } catch (ClassNotFoundException e) {
                //Handle exception if you will
            }
        }
    }
}

И в манифесте модуля приложения Iandroid.permission.BIND_JOB_SERVICE также добавил к моему сервису:

<service
    android:name=".MyService"
    android:enabled="true"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="false">
    <intent-filter>
        <action android:name="MY_ACTION" />
    </intent-filter>
</service>
...