AlarmMamanger不准确

时间:2016-02-02 12:23:03

标签: java android alarmmanager

我的应用程序设置了一个AlarmManager,每60秒触发一次。它触发一个片段,用于检查当前时间并查看应用程序日历中当时是否发生任何事件。 在我发现它跳过其中一个事件之前,它运行得很好。为了检查应用程序的完整性,我让片段在文本文件上写下当前时间(分钟0-59)并查看它是否跳过任何​​文件。仔细挖掘连续三天记录的文件后,我发现确实如此。

  

47,48,50,50,51,52,54,54,55,56,57,58,59,0,1,2,

这随机发生在任何地方。它发生在3-4小时后。这是另一个例子

  

1,1,3,4,5,6,7,7,9,9,10,11,12,13,

AlarmManager代码似乎没有任何问题。虽然如果代码跳过一分钟或在给定时间过去之前触发,那么某处就会出现问题。 这是我在AlarmManager上使用的代码

long alertTime = new GregorianCalendar().getTimeInMillis();

    int timeInterval = 60*1000;

    Intent alertIntent = new Intent(this, AlertRec.class);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alertTime, timeInterval, PendingIntent.getBroadcast(this, 1, alertIntent, PendingIntent.FLAG_UPDATE_CURRENT));

问题: 1)为什么AlarmManager不规律地动作? 2)如何避免这种情况?

我可以减少间隔时间来解决这个问题吗?我读到60是您需要申请的最短间隔。

1 个答案:

答案 0 :(得分:2)

根据此处的文件:http://developer.android.com/reference/android/app/AlarmManager.html

  

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

这几乎解释了大部分内容。另外,据我所知,他们在内部添加了重复警报的最小时间限制~1分钟,因此减少间隔可能不是最佳选择。

希望这有帮助!