AppWidget alarmmanager не обновляется

Итак, у меня есть виджет, я хочу, чтобы он обновлялся каждые 60 секунд. Когда виджет впервые добавляется на рабочий стол, он отлично выполняет функцию обновления. Кроме того, предполагается запустить AlarmManager, который будет перезапускать метод обновления каждые 60 секунд. Это та часть, которая, похоже, на самом деле не выполняется. Вот мой код:

public class ClockWidget extends AppWidgetProvider {

    public static String CLOCK_WIDGET_UPDATE = "com.nickavv.cleanwidget.CLEANCLOCK_UPDATE";

    @Override
    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];
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clocklayout);
            appWidgetManager.updateAppWidget(appWidgetId, views);
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
        Log.d("log","Entered update cycle");
        //Unimportant for these purposes
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }


    private PendingIntent createClockTickIntent(Context context) {
        Intent intent = new Intent(CLOCK_WIDGET_UPDATE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        return pendingIntent;
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.d("onEnabled","Widget Provider enabled.  Starting timer to update widget every minute");
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, createClockTickIntent(context));
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.d("onDisabled", "Widget Provider disabled. Turning off timer");
        AlarmManager alarmManager = (AlarmManager) context
        .getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(createClockTickIntent(context));
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        Log.d("onReceive", "Received intent " + intent);
        if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) {
            Log.d("onReceive", "Clock update");
            // Get the widget manager and ids for this widget provider, then
            // call the shared
            // clock update method.
            ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
            for (int appWidgetID: ids) {
                updateAppWidget(context, appWidgetManager, appWidgetID);
            }
        }
    }

}

Это продукт нескольких руководств, которые я нашел по этому вопросу, и моих собственных знаний об Android. Согласно моим логарифмам, он никогда не попадает в Log.d("onReceive", "Clock update"); линия. И да, мой манифест настроен на обновление часов. Спасибо!

РЕДАКТИРОВАТЬ: Дополнительная информация. Я помещаю строку журнала в метод createClockTickIntent, и он срабатывает. Итак, я предполагаю, что это означает, что в моем приложении запущена строка alarmManager.setRepeating, и я понятия не имею, почему она на самом деле не повторяется.


person Nick    schedule 22.09.2011    source источник
comment
Несмотря на то, что вы решили свою проблему, исправив орфографическую ошибку, спасибо за публикацию — это самая краткая и простая демонстрация того, как использовать AlarmManager для обновления виджетов приложений, которую я когда-либо видел! Существует так много ужасно сложных решений, но это прорезает все это с помощью метода, который прост для понимания и реализации. Спасибо!   -  person drmrbrewer    schedule 03.02.2015


Ответы (2)


Arggghhh, это была простая опечатка. Фильтр намерений был «com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE», и я написал «com.nickavv.cleanwidget.CLEANCLOCK_UPDATE».

Какая боль, но эй, теперь я знаю.

Итак, мораль этой истории для тех, у кого есть такая же проблема, как у меня: проверьте правописание! Проверьте это дважды или десять раз. На всем!

person Nick    schedule 22.09.2011
comment
или просто всегда копировать/вставлять :-) (спасибо за вопрос, кстати! Было очень полезно увидеть, как вы это сделали) - person Steve Pomeroy; 25.11.2011
comment
В такой ситуации всегда лучше использовать статическую строковую переменную вместо прямого использования строки, например final static String FILTER_CLEAN_CLOCK = com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE - person Hitesh Chavda; 28.11.2020

Вы должны сделать appwidget-provider и установить updatePeriodMillis на 0,6 секунды, тогда он будет обновляться каждые 60 секунд.

<?xml version="1.0" encoding="utf-8" ?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dp"
android:initialLayout="@layout/YourLayout"
android:updatePeriodMillis="0.6"
android:minHeight="144dp"/>
person Mr.James    schedule 22.09.2011
comment
Извините, я знаю, что это неправильно. Для начала у меня есть appwidget-provider, но updatePeriodMillis не может быть меньше 30 минут, поэтому я должен использовать AlarmManager. Кроме того, 60 миллисекунд будут 0,6 секунды, а не 60 секунд. Хотя большое спасибо за ответ - person Nick; 22.09.2011
comment
@Nick, ты прав, но ты уверен, что период обновленияMillis не может быть меньше 30 минут? Потому что я делаю виджет и ставлю на 10 минут и он работает. - person Mr.James; 22.09.2011
comment
Да, они были ограничены 30 минутами, начиная с Android 1.6. - person Nick; 22.09.2011