AlarmManager立即触发广播

时间:2014-07-09 13:32:33

标签: xamarin xamarin.android

问题:我的闹钟管理器立即触发。

我已经看过堆栈溢出的其他例子,人们面临同样的问题,但我似乎无法弄清楚为什么我的问题也一样。我在timeToFire参数中输入了较高的值,但仍然会立即触发。

    public void StartAlarm(string title, string message,int id, DateTime timeToBroadcast)
    {   
        var localIntent = new Intent(_context, typeof (NotificationManager));
        localIntent.PutExtra("title", title);
        localIntent.PutExtra("message", shortMessage);
        localIntent.PutExtra("Id", id);

        _mAlarmSender = PendingIntent.GetBroadcast(_context, id, localIntent, 0);

        var am = (AlarmManager) _context.GetSystemService(Context.AlarmService);

        long timeToFire = SystemClock.CurrentThreadTimeMillis() + 100*1000;

        am.Set(AlarmType.RtcWakeup, timeToFire, _mAlarmSender);
    }

这些是我在审核中寻找答案的其他问题

AlarmManager Interval for Android

why does my alarm go off straight away? (android)

set the time in Alarm manager Android - alarm fired instantly

1 个答案:

答案 0 :(得分:4)

根据Android文档,AlarmType.RtcWakeup [1]要求时间相对于UTC。我相信SystemClock.CurrentThreadTimeMillis() [2]是自启动以来经过的毫秒数。我想这就是导致triggerAtMillis值被过去处理的原因,并立即触发警报,因为这个值非常低。

您真正想要的是使用标准System.currentTimeMillis() [3]方法。这将为您提供相对于UTC的当前时间,这是AlarmManager所期望的。

BTW:这个版本的C#是Java.Lang.JavaSystem.CurrentTimeMillis()

[1] http://developer.android.com/reference/android/app/AlarmManager.html#RTC_WAKEUP

  

public static final int RTC_WAKEUP

     

System.currentTimeMillis()中的警报时间(墙   以UTC为单位的时钟时间,它将在设备熄灭时唤醒设备。

     

常数值:0(0x00000000)

[2] http://developer.android.com/reference/android/os/SystemClock.html#currentThreadTimeMillis()

  

public static long currentThreadTimeMillis()

     

返回当前线程中运行的毫秒数。

     

返回线程中经过的毫秒数

[3] http://developer.android.com/reference/java/lang/System.html#currentTimeMillis()

  

public static long currentTimeMillis()

     

返回自此以来的当前时间(以毫秒为单位)   1970年1月1日00:00:00.0 UTC。

     

无论系统的时间如何,此方法始终返回UTC时间   区。这通常称为" Unix时间"或"纪元时间"。用一个   DateFormat实例,用于格式化此时间以显示给人。

     

此方法不应用于测量超时或其他已用时间   时间测量,因为改变系统时间会影响结果。   使用nanoTime()。

希望这有帮助。