在DateTime上的xamarin SetAlarm

时间:2019-02-06 18:06:04

标签: xamarin xamarin.android

我希望设置警报,以便在触发警报时发送通知。我下面的代码alarmDate.Millisecond返回0(因为从未设置过)。它应该返回正确的毫秒数才能使警报正常工作-我认为UTC需要花费毫秒级的时间-但在英国,时间必须是格林尼治标准时间(GMT)/夏令时(DST)。

代码:

    private void InitBroadcast()
    {
        // Build the intents
        var intent = new Intent(this, typeof(MyReceiver));
        var pendingIntent = PendingIntent.GetBroadcast(this, 0, intent, 0);

        var alarmManager = (AlarmManager)GetSystemService(AlarmService);

        // Build the dates
        var currentDate = DateTime.Now;
        var alarmDate = new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, 5, 29, 0, DateTimeKind.Local);


        // If the alarm time has already past, set the alarm date to tomorrow
        if (DateTime.Compare(currentDate, alarmDate) < 0) {
            alarmDate.AddDays(1);
        }



        alarmManager.SetRepeating(AlarmType.RtcWakeup, alarmDate.Millisecond, millisInADay, pendingIntent);

        textView.SetText(string.Format("Alarm set for {0}", alarmDate.ToString()), TextView.BufferType.Normal);
    }

1 个答案:

答案 0 :(得分:0)

检查文档:https://docs.microsoft.com/en-us/dotnet/api/system.datetime.millisecond?view=netframework-4.7.2#System_DateTime_Millisecond

  

毫秒部分,表示为0到999之间的值。

因此alarmDate.Millisecond不会返回0,因为它从未设置过,而是返回0,因为它被设置为零,所以您使用alarmDate = new DateTime(currentDate.Year, currentDate.Month, currentDate.Day, 5, 29, 0, DateTimeKind.Local);创建了DateTime对象

请参阅:https://docs.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.7.2#System_DateTime__ctor_System_Int32_System_Int32_System_Int32_System_Int32_System_Int32_System_Int32_System_DateTimeKind_

您正在将时间设置为当前日期,即上午5:29(0表示秒,因此隐含0表示毫秒)。

alarmDate.Ticks会给您二十世纪初以来出现的“滴答声”(1 / 10,000毫秒)的数字。但是请记住,SushiHangover在他的评论的so链接中说了什么

  

Android的AlarmManager基于Android / Linux纪元毫秒

不是.NET DateTime滴答。纪元毫秒是自1970年1月1日格林尼治标准时间00:00:00(1970-01-01 00:00:00 GMT)以来经过的毫秒数。

因此,不要将alarmDate.Millisecond传递给alarmManager.SetRepeating方法,而应在当前时间和1970年1月1日午夜GMT之间使用一个TimeSpan来获取历元毫秒,并将其传递给它,例如: / p>

var epochMs = (alarmDate - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
alarmManager.SetRepeating(AlarmType.RtcWakeup, (Int64)epochMs, millisInADay, pendingIntent);