Android系统。警报管理器在奇怪的时间触发

时间:2013-12-03 13:14:41

标签: android performance alarmmanager alarm

我使用以下代码设置重复闹钟(每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

我注意到三种不同的异常现象:

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

  2. 两条消息之间的6分钟模式,然后是4分钟。您可以多次看到此模式。我假设操作系统会进行一些优化,例如,如果它每两分钟有一次其他警报(例如检查是否有新的电子邮件),它会一起运行它们(并且收音机只打开一次而不是二)。

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

  4. 所以我的问题:

    1. 如何强制系统每5分钟运行一次(或者更加努力)?

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

    3. 谢谢!

2 个答案:

答案 0 :(得分:8)

从API(here):

  

注意:从API 19(KITKAT)开始,警报传递是不准确的:操作系统   将移动警报以最小化唤醒和电池使用。那里   是支持需要严格交付的应用程序的新API   担保;请参阅setWindow(int,long,long,PendingIntent)和   setExact(int,long,PendingIntent)。应用程序   targetSdkVersion早于API 19将继续看到   以前的行为,其中所有警报都在何时传递   请求。

因此,如果您使用的是API 19,那么请回答您的两个问题......

答案 1 :(得分:-1)

  

如何强制系统每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 );