我让我的后台服务将设备的地理数据发送到API。
private static long LOCATION_INTERVAL = 1800000;
应该是位置服务的间隔和AlarmManager
。
我在这个MainActivity
中发出的第一个警报
Intent i = new Intent(this, typeof(LocationService));
PendingIntent pending = PendingIntent.GetService(this, 1, i,
PendingIntentFlags.CancelCurrent);
AlarmManager alarm = (AlarmManager)GetSystemService(AlarmService);
alarm.SetExact(AlarmType.RtcWakeup, 30000, pending);
然后,在服务本身,我像这样重新触发警报
Intent intent = new Intent(this, typeof(LocationService));
PendingIntent pending = PendingIntent.GetService(this, 100, intent,
PendingIntentFlags.CancelCurrent);
AlarmManager alarm = (AlarmManager)GetSystemService(AlarmService);
alarm.SetExact(AlarmType.RtcWakeup,
LOCATION_INTERVAL, pending);
问题:服务过早被调用(+/-每分钟!)。
问题:如何让我的闹钟管理器坚持LOCATION_INTERVAL
?
答案 0 :(得分:2)
请您检查下面的解决方案,让我知道结果?
如果不起作用,我会删除答案....
<强>问题强>
我相信错误在这里:
alarm.SetExact(int type, long triggerAtMillis, PendingIntent operation);
triggerAtMillis:使用适当的时钟(取决于警报类型)警报应该关闭的时间(以毫秒为单位)。
因此,您正在使用1800000
作为triggerAtMillis。但是,1800000
遵循UTC日期:Thu Jan 01 1970 00:30:00
由于这是旧日期,警报会立即触发。
<强>解决方案强>
也许,您应该按如下方式更新您的代码:
在MainActivity中,我相信你想立即发出警报。所以,按如下方式创建它:
alarm.SetExact(AlarmType.RtcWakeup, Calendar.getInstance().getTimeInMillis(), pending);
在您的服务中,似乎您想在1800000
之后触发警报。所以,你必须使用:
alarm.SetExact(AlarmType.RtcWakeup, Calendar.getInstance().getTimeInMillis() + LOCATION_INTERVAL, pending);
这样,警报将在当前时间(当前时间+ LOCATION_INTERVAL)后30分钟触发。
请记住,第二个参数是以毫秒为单位的日期...这是一个代表整个日期的数字(而不仅仅是间隔)......