Android 8.0 启动后台service 出错 IllegalStateException: Not allowed to start service Intent

出错信息

E AndroidRuntime: FATAL EXCEPTION: main
E AndroidRuntime: Process: com.cjl.servicetest, PID: 4455
E AndroidRuntime: java.lang.RuntimeException: Unable to create application com.cjl.servicetest.App: java.lang.IllegalStateException: Not allowed to start service Intent { act=lock cmp=com.cjl.servicetest/com.cjl.servicetest.service.KeyguardService (has extras) }: app is in background uid UidRecord{9d2827c u0a19 RCVR idle change:uncached procs:1 seq(0,0,0)}
E AndroidRuntime:   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5770)
E AndroidRuntime:   at android.app.ActivityThread.-wrap1(Unknown Source:0)
E AndroidRuntime:   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1680)
E AndroidRuntime:   at android.os.Handler.dispatchMessage(Handler.java:106)
E AndroidRuntime:   at android.os.Looper.loop(Looper.java:164)
E AndroidRuntime:   at android.app.ActivityThread.main(ActivityThread.java:6523)
E AndroidRuntime:   at java.lang.reflect.Method.invoke(Native Method)
E AndroidRuntime:   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
E AndroidRuntime:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)
E AndroidRuntime: Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { act=lock cmp=com.cjl.servicetest/com.cjl.servicetest.service.KeyguardService (has extras) }: app is in background uid UidRecord{9d2827c u0a19 RCVR idle change:uncached procs:1 seq(0,0,0)}
E AndroidRuntime:   at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1522)
E AndroidRuntime:   at android.app.ContextImpl.startService(ContextImpl.java:1478)
E AndroidRuntime:   at android.content.ContextWrapper.startService(ContextWrapper.java:650)
E AndroidRuntime:   at com.cjl.servicetest.service.KeyguardService.a(KeyguardService.java:80)
E AndroidRuntime:   at com.cjl.servicetest.DAApp.onCreate(DAApp.java:388)
E AndroidRuntime:   at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1119)
E AndroidRuntime:   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5767)
E AndroidRuntime:   ... 8 more

错误原因:

Android 8.0 不再允许后台service直接通过startService方式去启动, 具体行为变更如下:

如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。 新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行, 系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。

解决方法:

1. 修改启动方式

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} else {
    context.startService(intent);
}
2. 并且在service里再调用startForeground方法,不然就会出现ANR
context.startForeground(SERVICE_ID, builder.getNotification());

参考
https://stackoverflow.com/questions/46445265/android-8-0-java-lang-illegalstateexception-not-allowed-to-start-service-inten

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Android 8.0 及以上版本,为了增强应用程序的安全性,Android 引入了后台限制,禁止未在前台运行的应用程序启动服务。如果您想在后台启动服务,需要使用 `startForegroundService()` 方法。这个方法会启动一个前台服务,然后你可以在服务启动后在通知栏显示一个通知,以此来告知用户服务正在运行。 以下是一个使用 `startForegroundService()` 的示例代码: ``` if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 创建一个 NotificationChannel NotificationChannel channel = new NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT); // 向系统注册 NotificationChannel NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(channel); } // 创建一个 Intent启动你的服务 Intent serviceIntent = new Intent(this, YourService.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 在 Android 8.0 及以上版本上,需要调用 startForegroundService() 方法启动服务。 startForegroundService(serviceIntent); } else { // 在 Android 8.0 以下版本上,可以直接调用 startService() 方法启动服务。 startService(serviceIntent); } ``` 注意:如果你使用的是 `startForeground()` 方法,会在 Android 8.0 及以上版本上抛出 `IllegalStateException` 异常,因为 Android 8.0 及以上版本禁止在后台启动服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值