使用AlarmManager每天发送意图?

时间:2012-06-01 21:38:18

标签: android android-widget alarmmanager android-alarms

我想要以下内容:

  • AlarmManager在午夜向我的AppWidgetProvider发送日常意图。
  • 闹钟必须唤醒设备。

我是这样做的:

在我的AppWidgetProvider子类中:

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    Log.d(LOG_TAG, "Widget Provider enabled.  Starting timer");

    //Setting the Calender object to midnight time.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 0);
    calendar.add(Calendar.MINUTE, 0);
    calendar.add(Calendar.HOUR, 0);

    //The fired Intent
    Intent intent = new Intent(CLOCK_WIDGET_UPDATE); //custom intent name
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
        calendar.getTimeInMillis(), 1000*60*60*24, pendingIntent);
}

虽然我认为我做得对,但这段代码不起作用!

为了测试它,我用10000(10秒)改变了1000 * 60 * 60 * 24并用随机数更新了小部件中的textView。随机数从未改变过。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

我终于找到了问题!

我似乎也需要设置AM_PM值。当我使用getTime().toLocaleString()打印日历时,它设置为第二天但是12小时后(12:00:00 PM )。

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.AM_PM, Calendar.AM);
calendar.add(Calendar.DAY_OF_MONTH, 1);

这是Calender实例的完美设置,它将闹钟设置为第二天午夜(即最近的午夜)。您只需将其传递给setRepeating()方法。

感谢@CommonsWare

答案 1 :(得分:2)

首先,你想要的并不是严格可能的。 Android不是RTOS;你可能无法在“午夜时分”获得控制权

其次,您的Calendar对象代表过去的一个时间(除非它恰好是您执行该代码时的午夜,在这种情况下它代表现在)。尝试将来的开始时间。