如何防止屏幕关闭时触发警报?

How to prevent triggering alarm when screen is off?

我试图在特定时间间隔内触发警报 仅当设备处于唤醒状态时,这是我用来实现此目的的代码:

AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
                SystemClock.elapsedRealtime(),
                INTERVAL_ONE_MINUTE,
                pi);

考虑到有关 AlarmManager.ELAPSED_REALTIME android 的文档不应该在设备屏幕关闭时触发警报(如果我没记错的话)

Alarm time in SystemClock.elapsedRealtime() (time since boot, including sleep). This alarm does not wake the device up; if it goes off while the device is asleep, it will not be delivered until the next time the device wakes up

出乎我的意料,系统在屏幕关闭时触发了警报,我是不是漏掉了什么?

你为什么不使用

protected void onPause();

在那里开火

pi.cancel();
alarmManager.cancel(pi);

当他们说设备要休眠时,这并不意味着屏幕已关闭。

参见:When does android device go to sleep mode?

参见:http://developer.android.com/training/scheduling/wakelock.html

当设备的屏幕未打开时,它仍会不时被唤醒以执行操作。为了省电,它会休眠,但应用程序不可避免地会唤醒它来做事。

您可以检查屏幕是否打开:How can I tell if the screen is on in android?

您引用的文档只是说当使用 ELAPSED_REALTIME 时设备进入睡眠状态时不会触发警报。

听起来您希望在应用程序进程仍处于活动状态时触发警报。您可能会考虑使用 ActivityLicecycleCallbacks: http://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html

这将使您 schedule/cancel 基于流程生命周期的警报,而不是单一的 activity。

你也可以看看

Application.onTrimMemory

查看它何时被 OS 调用。您可能会发现在那里取消闹钟有些用处。