Android 8.0中的一些更改

本文详细记录了在升级Android应用至targetSdkVersion 26(即Android 8.0)时遇到的10个关键错误,包括后台服务限制、HTTP请求限制、通知渠道要求等,并提供了相应的解决策略,旨在帮助开发者顺利适配新版本。
摘要由CSDN通过智能技术生成

前言

Google Play应用市场对于应用的targetSdkVersion有了更为严a格的要求。从 2018 年 8 月 1 日起,所有向 Google Play 首次提交的新应用都必须针对 Android 8.0 (API 等级 26) 开发; 2018 年 11 月 1 日起,所有 Google Play 的现有应用更新同样必须针对 Android 8.0。

以下记录了我们升级targetSdkVersion的坑以及解决办法,希望对各位开发者有帮助。

错误1. java.lang.IllegalStateException: Not allowed to start service Intent {}: app is in background uid UidRecord{}

原因分析

从Android8.0开始,系统会对后台执行进行限制。初步判断由于我们应用在Application的onCreate过程中使用了IntentService来后台初始化一些任务,这个时候被系统认为是应用还处于后台,从而报出了java.lang.IllegalStateException错误。

解决办法

解决后台服务的限制,首先想到的办法是将服务变成前台服,随即我们又遇到了另一个问题,见错误2

错误2. android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{}

原因分析

见Android8.0行为变更。新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。

解决办法

在后台服务启动执行执行之后,通过Service.startForeground()方法传入notification变成前台服务。需要注意的是从Android8.0开始,Notification必须制定Channel才可以正常弹出通知,如果创建Notification Channels详见这里

由于我们的初衷是在启动程序的过程中后台进行一些初始化,这种前台给用户带来感知的效果并不是我们所希望的,因此我们考虑可以采用另一个后台执行任务的方法。这里官方推荐使用JobScheduler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值