近期由于项目需求,我们对网易新闻客户端做了 android 8.0的适配工作。经过一段时间的灰度完美上线了,大家都很开心。但好景不长,反馈系统了出现了几条让我们关注的问题,8.0系统上桌面 Widget 经常无法刷新数据。

看到此反馈,我们拉去了反馈用户的日志,发现确实是产生了问题,又查看了桌面 widget 的代码实现,发现这个问题果然是我们没有考虑到导致的。

原因

Android 8.0系统适配后 target升级到了26,这样就导致8.0的一些特性生效了。其中有一项限制是禁止应用在后台时启动 service。其实这个我们再试陪的时候就知道,但是我们当时的做法比较粗暴,即对所有 startService 的地方进行异常的捕获,这样能够保证不崩溃。
没有考虑到桌面 Widget 的数据请求和处理时我们是使用 Service 来提供的,因此后台 service 起不来,当然 widget 无法更新。

解决方案

弃用 service 后台处理数据,直接在接收到 widget 广播后请求数据,更新 View