【问题标题】:Android Handle All AlarmManager restrictionsAndroid 处理所有 AlarmManager 限制
【发布时间】:2019-08-28 23:08:34
【问题描述】:

我在 Play 商店中有一个闹钟应用程序,它在大多数设备上运行良好,但不幸的是,有些设备报告在调整后的时间不会触发闹钟,我从研究中得出结论,有些设备会限制应用程序在后台运行并杀死警报管理器!

我使用以下代码处理了打盹模式:

if (Build.VERSION.SDK_INT >= 23)
{
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeStamp, pendingIntent);
}
else if (Build.VERSION.SDK_INT >= 19)
{
alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeStamp, pendingIntent);
}
else
{
alarmManager.set(AlarmManager.RTC_WAKEUP, timeStamp, pendingIntent);
}

但在某些设备上这似乎还不够。

我已经读到前台服务可以防止系统终止应用程序,但是我也无法确保这一点,因为我手头没有发生问题的设备。

我想确保我的警报在所有设备上都能正常工作并处理所有情况,那么有什么办法可以确保我的应用程序正常运行并且不会被系统杀死?

【问题讨论】:

    标签: android alarmmanager clock android-doze


    【解决方案1】:

    您应该使用AlarmManagerCompat.setAlarmClock() 设置适合闹钟应用的用户可见闹钟。此 API 在 API 21+ 上使用 setAlarmClock(),根据其文档:

    即使系统处于低功耗空闲(又名打盹)模式,这些警报也将被允许触发。当系统看到这样的警报出现时,它也可能会做一些准备工作,以减少如果这导致设备完全唤醒可能发生的后台工作量 - 这是为了避免诸如大量的设备在早上的同一时间设置了闹钟,所有设备都在那个时间醒来并突然淹没网络,等待后台工作。因此,这些类型的警报在电池使用方面可能非常昂贵,并且只能用于其预期目的。

    【讨论】:

    • 谢谢,你认为这种方法还能防止系统强行杀死应用程序,从而阻止警报管理器吗?我在商店里看到两个大应用程序仍然建议在手机设置中的“请勿打扰”模式列表中手动将他们的应用程序列入白名单@ianhanniballake
    • 只要您使用CATEGORY_ALARM,您就不必担心“请勿打扰”。这与强制停止是完全不同的——它总是会取消你的应用程序可以做的所有事情来唤醒,包括警报。
    • 我最近才明白“dnd”只关注声音而不是电池优化,我的闹钟应用程序很特别,因为它使用手机媒体声音而不是手机闹钟声音,所以我想我不会担心无论如何“dnd”。另一个问题,setAlarmClock() 准确吗?在广播接收器中,我检查缓存警报的分钟和小时并与当前时间进行比较,所以如果小时和分钟不完全相同,那么我取消我的警报。 @ianhanniballake
    • 是的,setAlarmClock() 是准确的。我不知道你为什么要让你的BroadcastReceiver 复杂化,而不是在AlarmManager 上调用cancel() 并避免唤醒整个设备。
    • 我做这个检查是因为当你改变设备时钟时,广播接收器会被自动调用,即使它是在错误的时间。启动设备时也会发生同样的情况,广播接收器可能会在错误的时间触发。您是否知道解决此问题的方法,而不是检查广播接收器内的时间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多