Домашний виджет не обновляется в Oreo с помощью JobIntentService

Мое приложение содержит домашние виджеты, которые периодически обновляются с помощью IntentService,

Теперь при настройке API уровня 26 мне пришлось немного изменить это из-за ограничений на Oreo. Вы можете найти больше информации здесь.

Я нашел эту статью, в которой описано, как заставить IntentService работать на Oreo.

Я сделал все, как описано:

  • Переоборудовал мой IntentService в JobIntentService
  • переместил всю логику из onHandleIntent() в onHandleWork()
  • добавленной android:permission="android.permission.BIND_JOB_SERVICE" на сервис в файле AndroidManifest
  • также, <uses-permission android:name=”android.permission.WAKE_LOCK” /> уже используется в этом проекте
  • Я пошел дальше и начал использовать следующую логику для запуска Сервиса: enqueueWork(context, LocationForecastService.class, JOB_ID, work);

Это все еще не обновляет или инициализирует виджет должным образом. Сервис на самом деле запускается, загружает данные, но может быть проблема с отправкой данных через широковещательную рассылку. Работает, когда уровень API установлен на 24.

Виджеты регистрируются как BroadcastReceivers в файле AndroidManifest следующим образом:

<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 ответ

Чтобы это работало, мне нужно было реализовать все, как описано в URL, указанных в моем вопросе выше.

Очень важно соблюдать осторожность при создании намерения для отправки трансляции.

Вместо

Intent intent = new Intent(action);

Следующий код должен быть использован:

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

куда clazz класс провайдера виджетов

Другие вопросы по тегам