警报管理器有时很长 运行 的意图
Alarm Manager is sometimes very long to run the intent
AlarmManager 有问题。设置闹钟后,如果闹钟的时间已经过去,则开始启动意图,这很好。但有时在意图开始之前会有很长的时间(从 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);
}
这里的意图是:
[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);
}
}
}
manifest 没有问题,因为它有效,只是有时有点太长了。而且这个问题不是我的第二个意图,因为我在断点之前放了一个断点,等待时间在断点之前。
有人吗?
感谢阅读我的文章。
因为 setRepeating()
不保证 它会在准确的时间发生。
这就是为什么你会延迟 30 秒到 3 分钟。
将 setRepeating()
替换为 setExact()
参考来自 Here
的文档
manager.setExact(AlarmManager.RTC, startTime.getTimeInMillis(), operation);
要重复,您可以做的是,在执行您的当前事件后再次安排此警报 =28=]。因此,当您的 1st 意图被执行时,仅使用 setExact()
为 2nd 事件安排警报。这将保证您期望的时间准确性
AlarmManager 有问题。设置闹钟后,如果闹钟的时间已经过去,则开始启动意图,这很好。但有时在意图开始之前会有很长的时间(从 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);
}
这里的意图是:
[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);
}
}
}
manifest 没有问题,因为它有效,只是有时有点太长了。而且这个问题不是我的第二个意图,因为我在断点之前放了一个断点,等待时间在断点之前。
有人吗?
感谢阅读我的文章。
因为 setRepeating()
不保证 它会在准确的时间发生。
这就是为什么你会延迟 30 秒到 3 分钟。
将 setRepeating()
替换为 setExact()
参考来自 Here
manager.setExact(AlarmManager.RTC, startTime.getTimeInMillis(), operation);
要重复,您可以做的是,在执行您的当前事件后再次安排此警报 =28=]。因此,当您的 1st 意图被执行时,仅使用 setExact()
为 2nd 事件安排警报。这将保证您期望的时间准确性