Android系统。 报警pipe理器在奇怪的时间点火

我用下面的代码来设置重复报警(每5分钟)。

public void SetAlarm(Context context) { AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent i = new Intent(context, Alarm.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 5, pi); // Millisec * Second * Minute } 

似乎工作正常(它运行了近20小时),并在服务器上,我可以看到一些不断的消息到达。

然而,时代还有一些东西:我希望时间是每五分钟一次,而在服务器中我好像在不同的时间收到这些消息。

当服务器收到消息时,当手机处于睡眠模式(夜间)时,我添加了第一个序列:

 05:13:51, 05:18:54, 05:24:54, 05:28:54, 05:33:51, 05:38:54, 05:52:45, 05:54:54, 05:58:52, 06:04:54, 06:08:54, 06:16:19, 06:18:54, 06:24:54, 06:28:54, 06:34:54, 06:48:42, 06:48:44, 06:58:54, 

还有另一个序列,我不时用手机:

 11:08:46, 11:13:45, 11:18:48, 11:23:52, 11:33:54, 11:38:47, 11:48:47, 11:58:47, 12:03:52, 12:08:45, 12:14:49, 12:18:43, 12:25:37, 12:28:41, 12:34:56, 12:38:47, 12:43:48, 12:48:56, 12:54:07, 12:58:48, 13:03:43, 13:08:56, 13:14:11, 13:18:55, 13:25:02, 13:28:45, 13:33:43, 13:44:57, 13:48:58, 13:54:57, 13:58:52, 14:03:58 

我注意到三个不同的exception:

  1. 跳过警报(例如服务器中两条消息之间的间隔为10分钟) – 对我来说似乎很好,可能是由于连接问题。

  2. 两条消息之间6分钟的模式,然后4分钟。 你可以看到这个模式不止一次。 我有一个假设,操作系统做了一些优化,如果例如每两分钟有其他警报(例如检查是否有新的电子邮件),它将一起运行(而且无线电只打开一次而不是二)。

  3. 奇怪的间隔(我无法解释他们) – 你可以看到。

所以我的问题:

  1. 我怎样才能强制系统每5分钟运行一次(或者更加努力)呢?

  2. 奇怪的时机是什么原因? 我写了我的想法,但这些只是想法。

谢谢!

Solutions Collecting From Web of "Android系统。 报警pipe理器在奇怪的时间点火"

从API( 这里 ):

注意:从API 19(KITKAT)开始,报警传送是不准确的:操作系统将切换报警,以尽量减less唤醒和电池使用。 有新的API支持需要严格交付保证的应用程序; 请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续看到之前的行为,即所有报警都是在请求时准确传送的。

所以,如果你使用的API 19,那么你的两个问题的答案…

我怎样才能强制系统每5分钟运行一次(或者更加努力)呢?

试试这个代码,它工作100%

 Calendar calendar = new GregorianCalendar(); calendar.setTimeZone(TimeZone.getDefault()); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set( Calendar.MINUTE, 00 ); calendar.set( Calendar.SECOND, 00 ); Intent intent = new Intent(context, Alarm.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0 ); hourlyAlarm = (AlarmManager) context.getSystemService( Context.ALARM_SERVICE ); hourlyAlarm.setRepeating( AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),1000 * 60 * 5, pi );