2016-02-02 42 views
0

我的应用程序有一个AlarmManager设置为每60秒触发一次。它会触发一个片段,检查当前时间并查看应用程序日历中是否有当前发生的事件。 它运行的很好,直到我发现它跳过其中一个事件。为了检查应用程序的完整性,我让片段将当前时间(分钟0-59)写入文本文件,并查看它是否跳过任何​​内容。仔细查看连续三天录制的文件后,我发现它确实存在。AlarmMamanger不准确

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

** 1 ** - 因为您正在瞄准API级别19+。 ** 2 ** - 通过定位API级别18或根据操作系统版本使用不同的方法来设置PendingIntent/s。请查看[官方文档](http://developer.android.com/reference/android/app/AlarmManager.html)。 –

回答

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分钟,因此减少间隔可能不是最好的主意。

希望这会有所帮助!