【发布时间】:2014-09-13 17:38:22
【问题描述】:
我已创建并部署到 Google Play 警报应用程序。与往常一样,我在 8 个不同的真实设备(我不使用模拟器)上进行了大量测试,这些设备运行不同的 api 级别、root/non-root、不同的时区以及其他功能。
问题在于,在下载量超过 10,000 次后,一些用户抱怨警报在指定时间前 1 小时触发,而其他一些用户(4 倍数量)则抱怨警报在 1 小时后触发。我从世界上不同的地方得到这个,我也从同一个地方得到 5 星。 瞬间我以为我在代码的某些地方错误地使用了时区,但事实是我只是在使用
GregorianCalendar gc = new GregorianCalendar();
我在所有代码中都使用了这种实例化。我使用系统 AlarmManager 设置警报,例如:
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context.getApplicationContext(), AlarmReceiver.class);
GregorianCalendar gc = new GregorianCalendar();
long triggerAtMillis = 0;
if(nextAlarm != null){
triggerAtMillis = System.currentTimeMillis()
+ 60*1000*alarmDifference(nextAlarm, gc.get(Calendar.HOUR_OF_DAY), gc.get(Calendar.MINUTE), true)
- 1000*gc.get(Calendar.SECOND);
}else{
// Log.d("", "nextAlarm: NULL");
return;
}
PendingIntent operation = PendingIntent.getBroadcast(context.getApplicationContext(), REQUEST_CODE_ALARM_BROADCAST, intent, 0);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);
alarmDifference 方法很简单:
public static int alarmDifference(Alarm alarm, int hour, int minute, boolean inverse) {
int hours = hour - alarm.getHour();
if(inverse){
hours *= -1;
}
if(hours < 0)
hours += 24;
int minutes = minute - alarm.getMinute();
if(inverse){
minutes *= -1;
}
if(hours==0 && minutes<0){
hours = 23; //this happens if we set the time to the current hour
}
if(minutes < 0)
minutes += 60;
// Log.d("", "Time left: "+ hours+" hours, " + minutes+" minutes");
return hours*60 + minutes;
}
我的目标是 api 级别 17,所以我不会遇到系统不遵守交货时间的问题,并且必须使用 AlarmManager.setExact(...)。
要唤醒我的服务,我使用的是 WakefulBroadcastReceiver,因此我不必自己处理 WakeLock。
我在该网站上进行了大量研究,并尝试了不同的方法,但没有任何运气。
提前致谢。
【问题讨论】:
-
你在检查上午和下午吗?
-
请注意我正在使用 Calendar.HOUR_OF_DAY 的代码;那是 24 小时制,所以我不需要检查上午/下午。
标签: android alarmmanager