Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 报警管理器有时运行时间很长_Android_Xamarin_Alarmmanager - Fatal编程技术网

Android 报警管理器有时运行时间很长

Android 报警管理器有时运行时间很长,android,xamarin,alarmmanager,Android,Xamarin,Alarmmanager,我对经理有意见。设置报警时,如果报警时间已过,则启动意图,这非常好。但有时,在意图开始之前有很长的时间,从30秒到3分钟。如果有人知道原因,我很想知道 这是我的密码: public static void setAlarm() { Intent intent = new Intent(Application.Context, typeof(AlarmReceiver)); intent.SetAction("ExchangeGo"

我对经理有意见。设置报警时,如果报警时间已过,则启动意图,这非常好。但有时,在意图开始之前有很长的时间,从30秒到3分钟。如果有人知道原因,我很想知道

这是我的密码:

 public static void setAlarm()
        {
            Intent intent = new Intent(Application.Context, typeof(AlarmReceiver));
            intent.SetAction("ExchangeGo");
            PendingIntent pendingIntent = PendingIntent.GetBroadcast(Application.Context, 0, intent, PendingIntentFlags.CancelCurrent);
            Calendar dayCalendar = Calendar.GetInstance(Java.Util.TimeZone.Default);
            dayCalendar.Set(CalendarField.HourOfDay, 8);
            dayCalendar.Set(CalendarField.Minute, 30);
            dayCalendar.Set(CalendarField.Second, 0);
            dayCalendar.Set(CalendarField.Millisecond, 0);       
            AlarmManager alarm = Application.Context.GetSystemService(Context.AlarmService).JavaCast<AlarmManager>();
            alarm.Cancel(pendingIntent);
            alarm.SetRepeating(AlarmType.RtcWakeup, dayCalendar.TimeInMillis, AlarmManager.IntervalDay, pendingIntent);

        }
清单没有问题,因为它可以工作,只是有时候有点太长了。问题并不是我的第二个意图,因为我在断点之前放置了一个断点,等待时间在断点之前

有人吗

谢谢你读我的书

因为setRepeating不能保证它会在精确的时间发生。 这就是为什么你会得到30秒到3分钟的延迟

将setRepeating替换为setExact请参阅中的文档


要重复此操作,您可以做的是,在执行当前事件后再次安排此警报。因此,当您的第一个意图得到执行时,仅使用setExact为第二个事件安排警报。这将首先保证您期望的时间准确性,谢谢。然后我得到了几个问题:它会每天重复吗?如果警报时间已经过去,它会开始吗?我编辑了答案,展示了如何使用setExact重复。是的,它将在您指定的确切时间开始。这个答案并不正确。setExact本可以在2014年解决这个问题。但在当今的安卓6+中,setExact将由于瞌睡而受到长时间的延迟。在Android 7+设备上,延迟将特别严重,这些设备有一种更具攻击性的打盹方式,在屏幕关闭后很快就会激活。
   [BroadcastReceiver]
    public class AlarmReceiver : BroadcastReceiver
    {
        private  String SOMEACTION = "ExchangeGo";
        public override void OnReceive(Context context, Intent intent)
        {
            String action = intent.Action;
            if (SOMEACTION.Equals(action))
            { 
                Intent intentService = new Intent(context, typeof(ExchangeService2));
                context.StartService(intentService);
            }
        }
    }
manager.setExact(AlarmManager.RTC, startTime.getTimeInMillis(), operation);