在应用程序启动时,应用程序启动应该执行一些网络任务的服务。
在目标API级别26后,我的应用程序无法在Android 8.0后台启动服务。
导致原因:java.lang.IllegalStateException:不允许启动
服务意图{
cmp = my.app.tt / com.my.service
}: app是在后台uid UidRecord{90372b1 u0a136 CEM空闲procs:1
seq (0, 0, 0)}
我的理解是:
后台执行限制
startService()方法现在抛出一个IllegalStateException
针对Android 8.0的应用程序尝试使用这种方法
不允许创建后台服务。
“在不被允许的情况下”——这实际上是什么意思?以及如何修复它。我不想把我的服务设置为前台
如果任何意图之前工作正常时,应用程序是在后台,这将不再是Android 8及以上的情况下。只引用意图,当app在后台时,它必须做一些处理。
必须遵循以下步骤:
Above mentioned intent should be using JobIntentService instead of
IntentService.
The class which extends JobIntentService should implement the - onHandleWork(@NonNull Intent intent) method and should have below the
method, which will invoke the onHandleWork method:
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, xyz.class, 123, work);
}
Call enqueueWork(Context, intent) from the class where your intent is defined.
Sample code:
Public class A {
...
...
Intent intent = new Intent(Context, B.class);
//startService(intent);
B.enqueueWork(Context, intent);
}
下面的类以前扩展了Service类
Public Class B extends JobIntentService{
...
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, B.class, JobId, work);
}
protected void onHandleWork(@NonNull Intent intent) {
...
...
}
}
com.android。支持:支持compat需要JobIntentService -我使用26.1.0 V。
最重要的是确保Firebase库的版本至少是10.2.1,我在10.2.0有问题——如果你有的话!
你的manifest应该具有Service类的以下权限:
服务android: name = "。B”
android:出口= " false "
android:许可= " android.permission.BIND_JOB_SERVICE "
希望这能有所帮助。
如果任何意图之前工作正常时,应用程序是在后台,这将不再是Android 8及以上的情况下。只引用意图,当app在后台时,它必须做一些处理。
必须遵循以下步骤:
Above mentioned intent should be using JobIntentService instead of
IntentService.
The class which extends JobIntentService should implement the - onHandleWork(@NonNull Intent intent) method and should have below the
method, which will invoke the onHandleWork method:
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, xyz.class, 123, work);
}
Call enqueueWork(Context, intent) from the class where your intent is defined.
Sample code:
Public class A {
...
...
Intent intent = new Intent(Context, B.class);
//startService(intent);
B.enqueueWork(Context, intent);
}
下面的类以前扩展了Service类
Public Class B extends JobIntentService{
...
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, B.class, JobId, work);
}
protected void onHandleWork(@NonNull Intent intent) {
...
...
}
}
com.android。支持:支持compat需要JobIntentService -我使用26.1.0 V。
最重要的是确保Firebase库的版本至少是10.2.1,我在10.2.0有问题——如果你有的话!
你的manifest应该具有Service类的以下权限:
服务android: name = "。B”
android:出口= " false "
android:许可= " android.permission.BIND_JOB_SERVICE "
希望这能有所帮助。
如果你在8.0上运行你的代码,那么应用程序将会崩溃。因此,在前台启动服务。如果低于8.0,使用以下命令:
Intent serviceIntent = new Intent(context, RingtonePlayingService.class);
context.startService(serviceIntent);
如果在8.0以上,那么使用这个:
Intent serviceIntent = new Intent(context, RingtonePlayingService.class);
ContextCompat.startForegroundService(context, serviceIntent );
您可以尝试此代码以避免崩溃。正如谷歌开发者在问题跟踪器中所说。
private val activityManager by lazy { getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager }
//due to https://issuetracker.google.com/issues/113122354
private fun isInForegroundByImportance(): Boolean {
val importanceState = activityManager.runningAppProcesses.find {
it.pid == android.os.Process.myPid()
}?.importance ?: return false
return importanceState >= RunningAppProcessInfo.IMPORTANCE_FOREGROUND
}
和使用
override fun onResume() {
super.onResume()
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O || isInForegroundByImportance()) {
val intent = Intent(this, BluetoothScannerService::class.java)
this.startService(intent)
}
}