使用AlarmManager时的困惑,更新小部件时的意图

时间:2013-06-16 18:57:56

标签: android performance android-intent android-widget alarmmanager

我是Android开发和Java的新手,我正在尝试使用AlarmManager更新我的小部件,但我无法完全理解为什么大多数教程不会以下列方式更新小部件。我正在使用textview在我的窗口小部件中显示一个数字,每秒递增一次,并在移除窗口小部件时将其减少10,并在删除所有窗口小部件时将其重置为0。

public class widget_1_1 extends AppWidgetProvider {
    private static int var1 = 0;

    public void onReceive(Context context, Intent intent)
    {
        AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
        ComponentName widgetComponent = new ComponentName(context.getPackageName(), this.getClass().getName());
        int[] widgetId = widgetManager.getAppWidgetIds(widgetComponent);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE))
        {
            this.onUpdate(context, AppWidgetManager.getInstance(context), widgetId);
            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+1000, 1000, pendingIntent);
        }
        else if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DELETED))
        {
            // one widget deleted
            var1-=10;
        }
        else if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DISABLED))
        {
            // last widget deleted
            alarmManager.cancel(pendingIntent);
            var1=0;
        }
    }

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
         var1++;
        // Code to update widget by calling appWidgetManager.updateAppWidget here
    }
}

上述方法有问题吗?我看到的所有教程都使用私有静态最终字符串alarmAction =“com.elison.widget1.ALARM_ACTION”或类中的类似字符串,并使用它来获取PendingIntent。我不明白它的好处是什么,为什么不是上面这个简单的方法?

public void onReceive(Context context, Intent intent)
{
    // Some code
    Intent enable = new Intent(alarmAction);
    intent.setClass(context, WYDAppWidgetProvider_4_1.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, enable, 0);
    // Some tutorials use PendingIntent.FLAG_UPDATE_CURRENT instead of 0 in 4th parameter
    // more code
}

1 个答案:

答案 0 :(得分:0)

您的代码唯一的问题是PendingIntent创建应该在if语句内部检查是否有WIDGET_UPDATE操作。另外一点是,您每次使用重复警报管理器时都不需要创建AlarmManager。你也每次手动提取widgetId数组,它也应该在if语句中。