使用JobIntentService在Oreo上刷新主页小部件

时间:2018-06-19 07:30:21

标签: android android-widget android-intentservice jobintentservice

我的应用包含家庭小工具,这些小工具会定期使用IntentService更新。

现在,当针对API级别26时,由于对Oreo的限制,我不得不稍微改变一下。您可以找到更多信息here

我找到了this article,其中描述了如何让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>

有人遇到过类似的问题吗?

1 个答案:

答案 0 :(得分:0)

要完成这项工作,我必须按照上述问题中提供的网址实施所有操作。

在进行Intent发送广播时务必要小心。

代替

Intent intent = new Intent(action);

应使用以下代码:

Intent intent = new Intent(context, clazz);
intent.setAction(action);

clazz是窗口小部件提供程序类。