Xamarin AlarmManager立即启动广播

Xamarin AlarmManager立即启动广播,xamarin,xamarin.android,Xamarin,Xamarin.android,问题:我的报警管理器会立即启动 我已经看了其他关于堆栈溢出的例子,其中人们面临着相同的问题,但我似乎不明白为什么我的例子也有相同的问题。我在timeToFire参数中输入了很高的值,但仍然会立即触发 public void StartAlarm(string title, string message,int id, DateTime timeToBroadcast) { var localIntent = new Intent(_context, type

问题:我的报警管理器会立即启动

我已经看了其他关于堆栈溢出的例子,其中人们面临着相同的问题,但我似乎不明白为什么我的例子也有相同的问题。我在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);
    }
这些是我为寻找答案而复习的其他问题


根据Android文档,
AlarmType.RtcWakeup
[1]要求时间与UTC相关。我相信
SystemClock.CurrentThreadTimeMillis()
[2]是线程启动后经过的毫秒数。我想这就是导致
triggerAtMillis
值被视为过去的原因,并立即触发报警,因为该值将非常低

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

顺便说一句:它的C版本是
Java.Lang.JavaSystem.CurrentTimeMillis()

[1]

公共静态最终int RTC_唤醒

系统中的报警时间。currentTimeMillis()(墙 时钟时间(UTC),当设备关闭时,它将唤醒设备

常量值:0(0x00000000)

[2]

公共静态长currentThreadTimeMillis()

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

返回线程中经过的毫秒数

[3]

公共静态长currentTimeMillis()

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

此方法始终返回UTC时间,与系统的时间无关 区这通常被称为“Unix时间”或“大纪元时间”。使用 DateFormat实例,用于格式化此时间以显示给用户

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


希望这有帮助。

根据Android文档,
AlarmType.RtcWakeup
[1]要求时间与UTC相关。我相信
SystemClock.CurrentThreadTimeMillis()
[2]是线程启动后经过的毫秒数。我想这就是导致
triggerAtMillis
值被视为过去的原因,并立即触发报警,因为该值将非常低

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

顺便说一句:它的C版本是
Java.Lang.JavaSystem.CurrentTimeMillis()

[1]

公共静态最终int RTC_唤醒

系统中的报警时间。currentTimeMillis()(墙 时钟时间(UTC),当设备关闭时,它将唤醒设备

常量值:0(0x00000000)

[2]

公共静态长currentThreadTimeMillis()

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

返回线程中经过的毫秒数

[3]

公共静态长currentTimeMillis()

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

此方法始终返回UTC时间,与系统的时间无关 区这通常被称为“Unix时间”或“大纪元时间”。使用 DateFormat实例,用于格式化此时间以显示给用户

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


希望这能有所帮助。

感谢a mill的透彻解释。感谢a mill的透彻解释。