AppWidget 警报管理器未更新

Posted

技术标签:

【中文标题】AppWidget 警报管理器未更新【英文标题】:AppWidget alarmmanager not updating 【发布时间】:2011-11-22 10:02:01 【问题描述】:

所以,我有一个小部件,我希望它每 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 行,不知道为什么实际上没有重复。

【问题讨论】:

尽管您通过更正拼写错误解决了自己的问题,但感谢您发布此内容 - 这是我在任何地方看到的如何使用 AlarmManager 更新 appwidgets 的最简洁和简单的演示!那里有很多非常复杂的解决方案,但这通过一种易于理解和实施的方法解决了所有这些问题。谢谢! 【参考方案1】:

Arggghhh,这是一个简单的错字。意图过滤器是“com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE”,我写的是“com.nickavv.cleanwidget.CLEANCLOCK_UPDATE”

多么痛苦,但是嘿,现在我知道了。

所以,对于任何与我有类似问题的人来说,这个故事的寓意:检查你的拼写!检查两次,或十次。无所不能!

【讨论】:

或者总是复制/粘贴 :-)(谢谢你的问题,顺便说一句!看到你是如何做到这一点的非常有帮助) 对于这种情况,最好使用静态字符串变量而不是直接使用字符串,例如 final static String FILTER_CLEAN_CLOCK = "com.nickavv.cleanwidgets.CLEANCLOCK_UPDATE"【参考方案2】:

您必须创建一个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"/>

【讨论】:

对不起,我知道这不正确。首先,我有一个 appwidget-provider,但 updatePeriodMillis 不允许低于 30 分钟,这就是我必须使用 AlarmManager 的原因。此外,60 毫秒将是 0.6 秒,而不是 60 秒。非常感谢您的回复 @Nick ,你是对的,但是你确定 updatePeriodMillis 不允许低于 30 分钟吗?因为我制作了一个小部件并将其设置为 10 分钟,它就可以工作了。 是的,自 Android 1.6 以来,它们被限制为 30 分钟

以上是关于AppWidget 警报管理器未更新的主要内容,如果未能解决你的问题,请参考以下文章

普罗米修斯中的警报管理器未启动

Joomla 2.5(3.x)扩展管理器未找到扩展更新

Android Studio 2.3 sdk 管理器未打开

电脑文件夹右击导致window资源管理器未响应?

撤消管理器未与 NSPersistentDocument 保持同步

Android开发5:应用程序窗口小部件App Widgets的实现