Alarmmanager - 每分钟顶部的火警

时间:2014-10-10 15:43:05

标签: android android-widget alarmmanager

我试图在每一分钟发出警报。但由于某种原因,它并不想工作。这是一个小部件时钟应该每分钟更新。出于电池原因,我已经开启了屏幕关闭和接通的接收器。所以我的闹钟只在屏幕开启时触发。分钟应与我的系统时钟同步。

        public static void startClockTickAlarm() {
            AlarmManager alarmManager = (AlarmManager)_context.getSystemService(Context.ALARM_SERVICE);             
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            calendar.add(Calendar.SECOND, 1);       
            calendar.add(Calendar.HOUR, 1);
            alarmManager.setRepeating(AlarmManager.RTC, utcMillisNextMin(), 60000, createClockTickIntent(_context));
        }

        public static final long utcMillisNextMin() {
            Time t = new Time();
            t.setToNow();
            t.second = 0;
            t.minute++;
            System.out.println("Next Alarm: " + t.hour + ":" + t.minute + ":" + t.second);
            return t.normalize(true);
        }

我的System.out确切地告诉我它应该是什么。例如,我在11:30:15启用我的小部件,返回的结果是11:31:00 - 这意味着我的警报应该首先在11:31开火。根据我的系统时钟,闹钟太晚了5-15秒。警报触发太晚的秒数并不总是相同的(5到15秒之间)。

提前致谢。

2 个答案:

答案 0 :(得分:3)

@mighter所述,API> = 19如果您必须使用精确计时,请使用setExact() API。

if(android.os.Build.VERSION.SDK_INT < 19) {
    alarmManager.setRepeating(AlarmManager.RTC, utcMillisNextMin(), 60000, createClockTickIntent(_context));
} else {
    alarmManager.setExact(...);
}

答案 1 :(得分:1)

docs中有以下声明:

  

注意:从API 19开始,所有重复警报都不准确。如果你的   应用程序需要精确的交付时间,然后必须使用一次性   确切的警报,每次重新安排,如上所述。遗产   targetSdkVersion早于API 19的应用程序将   继续发出所有警报,包括重复警报,   确切地对待。

如果你在Android 4.4.4上运行,那么这可能就是原因。