AlarmManager太快触发了

时间:2016-07-27 12:33:45

标签: android service xamarin background

我让我的后台服务将设备的地理数据发送到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

1 个答案:

答案 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分钟触发。

请记住,第二个参数是以毫秒为单位的日期...这是一个代表整个日期的数字(而不仅仅是间隔)......