2014-10-10 51 views
2

我试图在每分钟之上触发报警。但由于某种原因,它不想工作。这是一个应该每分钟更新一次的Widget Clock。由于电池的原因,我已经做了一个关闭屏幕的接收器。所以我的闹钟只在屏幕开启时才会触发。分钟应与我的系统时钟同步。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秒之间)。

在此先感谢。

+0

您的设备上有哪些API级别? – 2014-10-10 15:51:02

+0

如果出现问题,请发布logcat输出。 – 2014-10-10 15:51:31

+0

我的设备是Android 4.4.4,我的目标是21,最小api是14. – zFr3eak 2014-10-10 15:52:33

回答

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(...); 
} 
+0

完美,这是我的想法。谢谢 ! – zFr3eak 2014-10-10 16:27:22

+0

我的代码在'if'块中倒退了。请检查。 – 2014-10-10 16:28:55

+0

是的,我已经认可了。 – zFr3eak 2014-10-10 17:00:57

1

有以下在docs声明:

注:为API 19日,所有重复报警是不准确的。如果您的 应用程序需要精确的交货时间,那么它必须使用一次性的精确警报,每次重新计划如上所述。传统 targetSdkVersion早于API 19的应用程序 将继续具有其所有警报,包括重复警报, 视为确切。

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

+0

有趣。所以我想我的功能应该是setWindow。所以为了仍然使用min api 14,我应该为当前api制作一个检查函数,如果api低于19或使用setWindow函数,请使用我当前的函数? – zFr3eak 2014-10-10 16:04:01

+0

@ user2887326您应该使用setExact。 – 2014-10-10 19:19:58