AppWidget闹钟管理器未更新

9

所以,我有一个小部件,希望它每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);
            }
        }
    }

}

这是我在学习IT技术的过程中从几个教程中总结出来的产物,同时也融入了我的安卓开发经验。根据我的日志记录,它从未到达Log.d("onReceive", "Clock update")这一行。是的,我的清单已经设置了时钟更新意图。谢谢!
编辑:附加信息。我在createClockTickIntent方法中放置了一个日志行,它被触发了。所以我猜这意味着我的应用正在运行alarmManager.setRepeating这一行,但不知道为什么它实际上并没有重复。

2
尽管你通过纠正一个拼写错误解决了自己的问题,但感谢你发布这篇文章——这是我见过的任何地方使用AlarmManager更新应用程序窗口小部件的最简明和简单的演示!虽然有很多可怕的复杂解决方案,但这种方法简单易懂,易于实现。 谢谢! - drmrbrewer
2个回答

3

啊,这只是一个简单的拼写错误。意图过滤器应该是“com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE”,而我写成了“com.nickavv.cleanwidget.CLEANCLOCK_UPDATE”。

真痛苦,但嘿,现在我知道了。

因此,对于任何遇到类似问题的人来说,故事的寓意是:检查你的拼写!检查一次,或者十次。所有地方都要检查!


2
或者始终复制/粘贴 :-)(感谢您的问题!看到您这样做非常有帮助) - Steve Pomeroy
对于这种情况,最好使用静态字符串变量而不是直接使用字符串,例如:final static String FILTER_CLEAN_CLOCK = "com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE"。 - Hitesh Chavda

-4
你需要创建一个 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"/>

1
对不起,我知道那不正确。我有一个appwidget-provider,但是updatePeriodMillis不能低于30分钟,这就是为什么我必须使用AlarmManager的原因。此外,60毫秒将是0.6秒,而不是60秒。非常感谢您的回复。 - Nick
@Nick,你说得对,但是你确定updatePeriodMillis不能低于30分钟吗?因为我制作了一个小部件并将其设置为10分钟,它也可以正常工作。 - Mr.James
1
是的,自从 Android 1.6 版本以来,它们被限制在30分钟内。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接