Чтобы принудительно обновить наши виджеты для определенного поставщика виджетов, нам необходимо сделать следующее:
- Настройка нашего провайдера для получения специализированной трансляции
- Отправкаспециализированная трансляция с:
- Все текущие идентификаторы виджетов, связанные с провайдером
- Данные для отправки
- Ключи, на которые отвечает только наш провайдер (Важно!)
- Получение нашего виджета для обновления по клику (без услуги!)
Шаг 1 - Настройте наш AppWidgetProvider
Iне будет подробно рассказывать о создании XML-файла info или изменениях в манифесте Android - если вы не знаете, как правильно создать виджет, то есть множество руководств, которые вы должны прочитать в первую очередь.
Вот пример AppWidgetProvider
Класс:
public class MyWidgetProvider extends AppWidgetProvider {
public static final String WIDGET_IDS_KEY ="mywidgetproviderwidgetids";
public static final String WIDGET_DATA_KEY ="mywidgetproviderwidgetdata";
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.hasExtra(WIDGET_IDS_KEY)) {
int[] ids = intent.getExtras().getIntArray(WIDGET_IDS_KEY);
if (intent.hasExtra(WIDGET_DATA_KEY)) {
Object data = intent.getExtras().getParcelable(WIDGET_DATA_KEY);
this.update(context, AppWidgetManager.getInstance(context), ids, data);
} else {
this.onUpdate(context, AppWidgetManager.getInstance(context), ids);
}
} else super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
update(context, appWidgetManager, appWidgetIds, null);
}
//This is where we do the actual updating
public void update(Context context, AppWidgetmanager manager, int[] ids, Object data) {
//data will contain some predetermined data, but it may be null
for (int widgetId : ids) {
.
.
//Update Widget here
.
.
manager.updateAppWidget(widgetId, remoteViews);
}
}
Шаг 2 - Отправка трансляции
Здесь мы можем создать статический метод, который получит наши виджетыОбновить.Важно, чтобы мы использовали наши собственные ключи с действием обновления виджета, если мы используем AppWidgetmanager.EXTRA_WIDGET_IDS, мы не только сломаем наш собственный виджет, но и другие.
public static void updateMyWidgets(Context context, Parcelable data) {
AppWidgetManager man = AppWidgetManager.getInstance(context);
int[] ids = man.getAppWidgetIds(
new ComponentName(context,MyWidgetProvider.class));
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(MyWidgetProvider.WIDGET_ID_KEY, ids);
updateIntent.putExtra(MyWidgetProvider.WIDGET_DATA_KEY, data);
context.sendBroadcast(updateIntent);
}
Если использовать этот метод с несколькимипровайдеры убедитесь, что они используют разные ключи.В противном случае вы можете найти виджет обновления кода виджета b, что может иметь некоторые странные последствия.
Шаг 3 - обновление по щелчку
Еще одна приятная вещь - это получитьнаш виджет обновляется волшебно при каждом нажатии.Чтобы получить это, добавьте следующий код в метод обновления:
RemoteViews views =
new RemoteViews(context.getPackageName(),R.layout.mywidget_layout);
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(myWidgetProvider.WIDGET_IDS_KEY, ids);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.view_container, pendingIntent);
Этот код будет вызывать метод onUpdate при каждом нажатии на виджет.
Примечания
- Любой вызов updateWidgets () приведет к обновлению всех экземпляров нашего виджета.
- Нажатие на виджет приведет к обновлению всех экземпляров нашего виджета
- НЕ ТРЕБУЕТСЯ ОБСЛУЖИВАНИЕ
- Конечно, будьте осторожны, чтобы не обновлять часто - обновления виджетов расходуют заряд батареи.
- Имейте в виду, что широковещательная рассылка принимается ВСЕМИ поставщиками виджетов, и нашаспециальные ключи, обеспечивающие обновление только наших виджетов.