Android Widgets - Как сделать обновление данных
Андроид виджеты – это небольшие приложения, которые могут быть встроены как на главном, так и на заблокированном экране и позволяют периодически обновляють данные. Эти элементы работают как часть процесса основного приложения, но не запускаются в явном виде.
Виджеты используют RemoteViews object для создания пользовательских интерфейсов. Класс этих объектов описывает иерархию представления экранов, которые должны отображаться в другом процессе. RemoteViews накладывает некоторые ограничения при использовании представления экранов и макетов. Вы не можете использовать собственные вью-элементы в виджетах. Со списком поддерживаемых макетов, можно ознакомиться здесь: AppWidgets on Google Developer Portal
Виджеты могут быть любого размера, однако Google рекомендует рассчитывать их по формуле: размер виджетов ((Количество колонок/строки)*74) 2.
В первую очередь при разработке виджетов нужно реализовать макет интерфейса. Во-вторых, необходимо создать класс, который будет расширять класс AppWidgetProvider, для реализации жизненного цикла виджетов:
public class MyWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setOnClickPendingIntent(R.id.image, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
onUpdate метод будет вызываться в зависимости от установленного периода обновления. Это необходимо для выполнения действий, которые изменяют состояние виджета. Также в файле манифеста вашего приложения, необходимо определить виджет, для этого нужно добавить Receiver и IntentFilter, например:
<?xml version="1.0" encoding="utf8"?>
<appwidgetprovider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_loading"android:configure=
"com.example.app.widget.WidgetConfigureActivity"
android:minHeight="144dp"
android:minResizeHeight="144dp"
android:minResizeWidth="250dp"
android:minWidth="250dp"
android:previewImage="@drawable/ic_launcher"
android:resizeMode="vertical|horizontal"
android:updatePeriodMillis="86400000"
android:widgetCategory="keyguard|home_screen" />
Минимальный период обновления виджета вашего мобильного приложения Google рекомендует устанавливать не чаще, чем один раз в час, так как частое обновление приведет к быстрой разрядке батареи. Но если вам необходимо обновлять данные чаще, то можно использовать AlarmManager в реализации класса вашего виджета. При этом необходимо установить значение updatePeriodMillis равным «0» в xml файле конфигурации виджета.
private void startRepeating(Context context) {
final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), UPDATE_PERIOD, serviceIntent);
}
private void cancelRepeating(Context context) {
final AlarmManager alarmManager = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
if (serviceIntent != null) {
alarmManager.cancel(serviceIntent);
}
}
Когда используем AlarmManager, обновление логики виджета должно происходить в Service и/или IntentService.
public class UpdateWidgetService extends IntentService {
private AppWidgetManager appWidgetManager;
private RemoteViews remoteViews;
public UpdateWidgetService() {
super("UpdateWidgetService");
}
@Override
protected void onHandleIntent(Intent intent) {
appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext());
int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS)
for (int widgetId : allWidgetIds) {
// TODO: refresh logic.
}
}
}
Android Виджеты – это отличный способ демонстрации гибких настроек, которые позволяют сделать главный экран функциональным и учесть индивидуальные потребности каждого пользователя.
Будем ждать ваших комментариев, спасибо!


