gpt4 book ai didi

Android AlarmManager PendingIntent 在调用 alarm.set() 之前启动

转载 作者:行者123 更新时间:2023-11-29 19:24:04 25 4
gpt4 key购买 nike

我已经阅读了这里所有类似的问题,但找不到答案,所以如果之前已经回答过,请原谅我,我真的尝试过搜索。

我正在设置闹钟以在特定时间后显示通知。时间逻辑绝对可靠,我可以从我的日志输出中看出,这不是问题。

我像这样创建一个 Pending Intent :

Intent alarmIntent = new Intent(c, AlarmReceiver.class);
alarmIntent.putExtra("title", name);
alarmIntent.putExtra("location", building);
PendingIntent pi = PendingIntent.getBroadcast(c, 0, alarmIntent, 0);

然后将闹钟设置为在 millis 毫秒后触发。在本例中,根据我的日志语句,millis407603959。它绝对不应该在一秒钟后触发。

alarm.set(AlarmManager.RTC_WAKEUP, millis, pi);
Log.i("Alarm", "Alarm: " + name + " is set for: "
+ untilAlarm.getDays() + " days, " + untilAlarm.getHours() + " hours, "
+ untilAlarm.getMinutes() + " minutes from now. Or, " + millis
+ " milliseconds");

似乎我的 PendingIntent 甚至在设置警报之前就已启动。我尝试阻止像这样创建警报:

Intent alarmIntent = new Intent(c, AlarmReceiver.class);
alarmIntent.putExtra("title", name);
alarmIntent.putExtra("location", building);
PendingIntent pi = PendingIntent.getBroadcast(c, 0, alarmIntent,
PendingIntent.FLAG_ONE_SHOT);

if (!name.equals("test") {
alarm.set(AlarmManager.RTC_WAKEUP, millis, pi);
//Log statement...
}

并且 test 的警报仍然被触发,但是日志语句没有打印到控制台,这意味着 alarm.set 从未被调用。 Intent 仍然被触发,并显示标题为“test”的通知。

为什么我的 PendingIntent 在警报响起之前启动?

最佳答案

您正在使用 AlarmManager.RTC_WAKEUP 闹钟类型,它将闹钟设置为在指定时间启动,在您的例子中为 millis

要将闹钟设置为在未来的特定时间开始,您需要使用以下类型之一的耗时闹钟:

  • ELAPSED_REALTIME

SystemClock.elapsedRealtime() 中的警报时间(自启动以来的时间, 包括 sleep )。此警报不会唤醒设备;如果它去 设备处于休眠状态时关闭,直到 下次设备唤醒时。

  • ELAPSED_REALTIME_WAKEUP

SystemClock.elapsedRealtime() 中的警报时间(自启动以来的时间, 包括 sleep ),这将在设备关闭时唤醒设备。

或者使用 RTCRTC_WAKEUP 当前时间加上等待时间,例如:

alarm.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + millis, pi);

关于Android AlarmManager PendingIntent 在调用 alarm.set() 之前启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com