android - 使用 JobIntentService 在 Oreo 上不刷新主页小部件
问题描述
我的应用程序包含使用定期更新的家庭小部件IntentService
。
现在,当面向 API 级别 26 时,由于 Oreo 的限制,我不得不稍微改变一下。你可以在这里找到更多信息。
我发现这篇文章描述了如何使 IntentService 在 Oreo 上工作。
我按照描述做了所有事情:
- 将我的转换
IntentService
为JobIntentService
- 将所有逻辑
onHandleIntent()
从onHandleWork()
- 在 AndroidManifest 文件中添加
android:permission="android.permission.BIND_JOB_SERVICE"
到服务中 - 另外,
<uses-permission android:name=”android.permission.WAKE_LOCK” />
已经在这个项目中使用 - 我更进一步,开始使用以下逻辑来启动服务:
enqueueWork(context, LocationForecastService.class, JOB_ID, work);
它仍然没有正确刷新或初始化小部件。服务实际启动,下载数据,但问题可能出在通过广播发送数据的某个地方。它在 API 级别设置为 24 时有效。
小部件在 AndroidManifest 文件中注册为 BroadcastReceivers,如下所示:
<receiver
android:name=".widgets.provider.WeekWidgetProvider"
android:label="@string/Widget_WeekForecast_Title">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="action_widget_data_change_event" />
<action android:name="action_week_widget_data_change_event" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/appwidget_week_provider_layout" />
</receiver>
有人遇到过类似的问题吗?
解决方案
为了完成这项工作,我必须按照上面问题中提供的 URL 中的描述实现所有内容。
在制作 Intent 发送广播时要小心,这一点非常重要。
代替
Intent intent = new Intent(action);
应使用以下代码:
Intent intent = new Intent(context, clazz);
intent.setAction(action);
clazz
小部件提供程序类在哪里。
推荐阅读
- mongodb - 如何在 MongoDb 中恢复特定的集合集
- bash - git !alias 可以在 bash 和 Powershell 中使用
- binding - SAPUI5 动态数据绑定(OData-Service 的键)
- hadoop - 通过 VM 安装 Ubuntu 以进行 Hadoop 环境设置
- java - LONG RAW 列的 jdbc 类型和 java 类型是什么?
- python - 比较列表并根据两者的内容创建新列表
- inkscape - 将文本从 excel 移动到 inkscape
- c# - 在 system32 目录中的现有文件上找不到文件异常
- javascript - Prestashop 在 numbers.json 中更改货币
- sql - 如何在存储库查询中使用任何值