在应用程序启动时,应用程序启动应该执行一些网络任务的服务。
在目标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的应用程序尝试使用这种方法
不允许创建后台服务。
“在不被允许的情况下”——这实际上是什么意思?以及如何修复它。我不想把我的服务设置为前台
我有办法了。对于8.0版本之前的设备,你必须使用startService(),但是对于7.0版本之后的设备,你必须使用startForgroundService()。下面是启动服务的代码示例。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(new Intent(context, ServedService.class));
} else {
context.startService(new Intent(context, ServedService.class));
}
在服务类中,请添加以下代码进行通知:
@Override
public void onCreate() {
super.onCreate();
startForeground(1,new Notification());
}
其中O为Android版本26。
如果你不想让你的服务在前台运行,而想让它在后台运行,发布Android O,你必须将服务绑定到如下连接:
Intent serviceIntent = new Intent(context, ServedService.class);
context.startService(serviceIntent);
context.bindService(serviceIntent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//retrieve an instance of the service here from the IBinder returned
//from the onBind method to communicate with
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}, Context.BIND_AUTO_CREATE);
您可以尝试此代码以避免崩溃。正如谷歌开发者在问题跟踪器中所说。
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)
}
}
我有办法了。对于8.0版本之前的设备,你必须使用startService(),但是对于7.0版本之后的设备,你必须使用startForgroundService()。下面是启动服务的代码示例。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(new Intent(context, ServedService.class));
} else {
context.startService(new Intent(context, ServedService.class));
}
在服务类中,请添加以下代码进行通知:
@Override
public void onCreate() {
super.onCreate();
startForeground(1,new Notification());
}
其中O为Android版本26。
如果你不想让你的服务在前台运行,而想让它在后台运行,发布Android O,你必须将服务绑定到如下连接:
Intent serviceIntent = new Intent(context, ServedService.class);
context.startService(serviceIntent);
context.bindService(serviceIntent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//retrieve an instance of the service here from the IBinder returned
//from the onBind method to communicate with
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}, Context.BIND_AUTO_CREATE);