隐式启动 JobIntentService
Start a JobIntentService Implicitly
如您所知,我们就是这样触发 JobIntentService
:
JobIntentService.enqueueWork(this,
MyJobIntentService.class,
JOB_ID,
intent);
在这种方法中,我们知道我们要启动哪个服务并将其class传递给方法。
这是我的问题:有什么方法可以启动服务 隐式 ?
为什么我需要这个?我正在开发一个库,有时应该启动开发人员扩展的服务,显然我无法从库中访问它
我尝试了什么? 我用 IntentService
实现了它(使用意图过滤器)并且在 O 之前的设备上运行良好但是对于 Android Oreo 我收到了这个崩溃日志:
Fatal Exception: java.lang.IllegalStateException: Not allowed to start
service Intent { act=someAction
pkg=somePackage (has extras) }: app is in background uid
UidRecord{de24eda u0a238 RCVR idle procs:1 seq(0,0,0)}
所以我搬到了JobIntentService
,现在的问题是我无法隐式启动它。
任何解决方案或替代方案将不胜感激。
好吧,我找到了一个解决方案,首先查询您正在寻找的服务并检查是否具有 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>
如您所知,我们就是这样触发 JobIntentService
:
JobIntentService.enqueueWork(this,
MyJobIntentService.class,
JOB_ID,
intent);
在这种方法中,我们知道我们要启动哪个服务并将其class传递给方法。
这是我的问题:有什么方法可以启动服务 隐式 ?
为什么我需要这个?我正在开发一个库,有时应该启动开发人员扩展的服务,显然我无法从库中访问它
我尝试了什么? 我用 IntentService
实现了它(使用意图过滤器)并且在 O 之前的设备上运行良好但是对于 Android Oreo 我收到了这个崩溃日志:
Fatal Exception: java.lang.IllegalStateException: Not allowed to start service Intent { act=someAction pkg=somePackage (has extras) }: app is in background uid UidRecord{de24eda u0a238 RCVR idle procs:1 seq(0,0,0)}
所以我搬到了JobIntentService
,现在的问题是我无法隐式启动它。
任何解决方案或替代方案将不胜感激。
好吧,我找到了一个解决方案,首先查询您正在寻找的服务并检查是否具有 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>