隐式启动JobIntentService

时间:2018-09-24 12:18:43

标签: android android-8.0-oreo jobintentservice

如您所知,这就是我们触发JobIntentService的方式:

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

在这种方法中,我们知道我们要启动哪个服务并将其类传递给该方法。
这是我的问题有什么方法可以启动服务 隐式吗?
我为什么需要这个?我正在开发一个有时会启动开发人员扩展的服务的库,显然我无法从库访问它
我尝试了什么?我使用IntentService实现了它(使用意图过滤器),并且在O之前的设备上运行良好,但是对于Android Oreo,我收到了以下崩溃日志:

  

致命异常:java.lang.IllegalStateException:不允许启动   服务意图{act = someAction   pkg = somePackage(有其他功能)}:应用程序在后台uid中   UidRecord {de24eda u0a238 RCVR空闲过程:1 seq(0,0,0)}

所以我移到JobIntentService,现在的问题是我不能隐式启动它。
任何解决方案或替代方案将不胜感激。

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个解决方案,首先查询您要查找的服务,然后检查是否具有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
            }
        }
    }
}

在应用程序模块清单中,我也向服务中添加了android.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>