我是靠谱客的博主 温暖指甲油,最近开发中收集的这篇文章主要介绍android8.0以后在Activity中调用startService启动服务报错,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Activity.onReume 中 startService 报错 java.lang.IllegalStateException: Not allowed to start service Intent

解决办法1(真正是前台服务,会有前台通知显示)
该方法调用 startForegroundService 后必须在5s内调用 startForeground启动前台通知,否则会报 ANR/无响应。


public ComponentName startServiceOreo(Intent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return startForegroundService(intent);
} else {
return startService(intent);
}
}

解决办法2(得有系统源码)
如果是系统应用可以添加到盛典模式白名单
在 frameworks/base/data/etc/platform.xml 添加以下配置则可加入白名单。

<allow-in-power-save package="com.android.xxxx" />

解决办法3(普通意义推荐该方法)
Android8.0后不允许app在后台通过startService()去启动服务。
但是在Activity#onResume()中启动的,按理说不会有问题,平时使用也没出问题,但是查看线上日志发现偶尔会出现崩溃,monkey测试也偶尔会有崩溃日志。网上查找有人说是系统的一个bug。
处理方法:通过try{}catch (){}捕获这个异常,然后在cache中延迟1秒钟再启动服务。


try {
return startService(intent);
} catch (IllegalStateException e) {
// TODO 在这里延时1s再启动服务 注意销毁时取消延时任务
}

Android 8.0 开始对以 startService 下变更:
(1)如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,
则该函数将引发一个 IllegalStateException。新的 Context.startForegroundService() 函数将启动一个前台服务。
(2)即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,
应用必须在创建服务后的5秒(实测是15s)内调用该服务的 startForeground() 函数。否则会报ANR,或者退出APP时报异常。

附录
AndroidManifest.xml 配置如下:


<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="28" />

异常log:

java.lang.RuntimeException: Unable to resume activity {com.android.soundrecorder/com.android.xxx.xxx}: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.android.xxx/.XXXService }: app is in background uid UidRecord{10e5885 u0a42 CAC
bg:+1m36s49ms idle change:cached procs:1 seq(0,0,0)}
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3815)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3847)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)

方法1中未调用startForeground异常log:

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{fa403ba u0 com.android.xxx/.XXXService}

参考文献:
Android开发中的一些问题: https://blog.csdn.net/androidzf/article/details/86611414
Android8.0后台执行限制:https://developer.android.google.cn/about/versions/oreo/background

最后

以上就是温暖指甲油为你收集整理的android8.0以后在Activity中调用startService启动服务报错的全部内容,希望文章能够帮你解决android8.0以后在Activity中调用startService启动服务报错所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部