AppWidget Imageview updatePeriodMillis - PullRequest
       67

AppWidget Imageview updatePeriodMillis

0 голосов
/ 11 октября 2018

Я пытаюсь обновлять ImageView в AppWidget каждые 30 минут, но безуспешно.

Для загрузки виджета используется библиотека Glide, и я подозреваю, что кешируется.

Я делаю все возможное, чтобы не мешать пробуждению и аккумулятору.Просто нужно время от времени менять изображение.На пробуждении все будет в порядке.

Я думаю, что 30-минутный опрос - это когда устройство активно.Например, когда он спит, он не считается и пропускает его.

Спасибо за вашу помощь.

res / xml / widget_name.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/widget_name"
    android:initialLayout="@layout/widget_name"
    android:minWidth="300dp"
    android:minHeight="100dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="1800000"
    android:widgetCategory="home_screen"></appwidget-provider>

com/WidgetName/WidgetName.java

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_name);

        AppWidgetTarget awt = new AppWidgetTarget(context, R.id.imageView, remoteViews, appWidgetIds) {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                super.onResourceReady(resource, transition);
            }
        };

        RequestOptions options = new RequestOptions().
                override(300, 300).placeholder(R.drawable.navigation_header_bg).error(R.drawable.ic_navigation_help);


        // Create an Intent to launch Browser
        Intent intent = new Intent(context, WidgetConfig.class);

        PendingIntent pendingIntent =
                PendingIntent.getActivity(context, 0, intent, 0);

        Log.i("WidgetName", "src " + src);
        remoteViews.setOnClickPendingIntent(R.id.imageView, pendingIntent);
        Glide.with(context.getApplicationContext())
                .asBitmap()
                .load(src)
                .apply(options)
                .into(awt);

    }

1 Ответ

0 голосов
/ 12 октября 2018

При просмотре вашего проекта вам необходимо внести следующие изменения.

в res / xml / widget_name.xml set android:updatePeriodMillis="0"

Затем в com / WidgetName / WidgetName.java

переопределить метод onReceive и внести следующие изменения

 @Override
public void onReceive(Context context, Intent intent) {
    switch (intent.getAction()) {
        case AppWidgetManager.ACTION_APPWIDGET_UPDATE:
            onUpdate(context, AppWidgetManager.getInstance(context), AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, LineaMeteoPremium.class)));
            break;
        default:
            super.onReceive(context, intent);
    }
}

И, так как вы обновляете все свои виджеты, обновляйте их последовательно в цикле следующим образом с AlarmManager , используемым в качестве вашеготриггер обновления (повышенная гибкость, поскольку вы также можете разрешить пользователям устанавливать пользовательское время обновления), и другая проблема заключалась в том, что вы не использовали методы skipMemoryCache (true) и diskCacheStrategy (DiskCacheStrategy.NONE) длязаставьте glide получать новые изображения вместо просмотра в кеше.

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    for (int widgetId : appWidgetIds) {
        setUpAlarm(context, widgetId);

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.linea_meteo_premium);

        Log.e("LineaMeteo Widget", "src " + src);

        AppWidgetTarget awt = new AppWidgetTarget(context, R.id.imageView, remoteViews, appWidgetIds);

        RequestOptions options = new RequestOptions().
                override(300, 300).placeholder(R.drawable.navigation_header_bg).error(R.drawable.ic_navigation_help).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE);


        // Create an Intent to launch Browser
        Intent intent = new Intent(context, WidgetConfig.class);

        PendingIntent pendingIntent =
                PendingIntent.getActivity(context, 0, intent, 0);


        remoteViews.setOnClickPendingIntent(R.id.imageView, pendingIntent);

        Glide.with(context.getApplicationContext())
                .asBitmap()
                .load(src)
                .apply(options)
                .into(awt);
    }
}

Используйте следующий код, чтобы установить Alarm для обновления виджета в зависимости от времени, которое вы хотите

/**
 * Sets up widget refresh alarm
 *
 * @param context     The context of widget
 * @param appWidgetId Widget ID of current widget
 */
private void setUpAlarm(Context context, int appWidgetId) {
    final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    long interval = (3 * 60000); // 60000 = 1minute  | Change the formula based on your refresh timing needs

    PendingIntent alarmPendingIntent = getRefreshWidgetPendingIntent(context, appWidgetId);

    alarm.cancel(alarmPendingIntent);

    // SET NEW ALARM
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarm.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + interval, alarmPendingIntent);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarm.setExact(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + interval, alarmPendingIntent);
    } else {
        alarm.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + interval, alarmPendingIntent);
    }
}

/**
 * Get the pending intent object for refreshing the widget
 *
 * @param context  current Context
 * @param widgetId - Current Widget ID
 * @return - Pending intent for refreshing widget
 */
private PendingIntent getRefreshWidgetPendingIntent(Context context, int widgetId) {
    Intent intent = new Intent(context, LineaMeteoPremium.class);
    intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
    // Make the pending intent unique...
    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
    return PendingIntent.getBroadcast(context, 123, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

И самое главное,так как ваше приложение использует ClearText HTTP Traffic и поддержка открытого текста отключена по умолчанию начиная с Android 9.0, вам необходимо добавить следующий тег в манифест:Тег приложения для предотвращения сбоев виджетов на устройствах с Android 9. +.

<application
.
.
android:usesCleartextTraffic="true">
...