我的应用程序设置了一个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是您需要申请的最短间隔。
答案 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分钟,因此减少间隔可能不是最佳选择。
希望这有帮助!