AlarmManager在多个设备上无法正常工作

93
我的应用程序使用AlarmManager,自4年前以来一直在运行。但我注意到它开始在一些设备上失效。
我非常确定代码是正确的(我正在使用WakefulBroadcastReceiver,并且对于具有Doze的设备使用setExactAndAllowWhileIdle),因为它在Nexus设备上完美地工作,但在某些制造商的设备(华为,小米等)上失败了。
例如,华为设备有一种电池管理器会杀死应用程序,当应用程序被杀死时,计划的闹钟也会被取消。因此,在华为电池管理器中将应用程序设置为“受保护”可以解决问题。
但最近我发现它在更多设备中不起作用:小米,三星(也许与新的“智能管理器”有关?)...似乎这种行为正在成为标准:杀死后台应用程序。
有人知道任何相关信息吗?有什么方法可以确保闹钟被触发吗?
编辑:这个问题是由不同制造商添加的“省电模式”引起的。 更多信息请参见:https://dontkillmyapp.com/

9
制造商将功耗归咎于应用程序,并继续推销八核处理器,而与少数核心的CPU相比,这些处理器会消耗更多电池电量。他们认为仅仅增加一个核心就能加快手机的速度吗? - FrozenFire
1
@AviLevinshtein 或许我误解了你的问题。我是在我的活动中创建闹钟。然后,当闹钟响起时,会执行广播接收器,最后执行 WakefulIntentService(来自 @commonsware 的类)。 - Sergio Viudes
2
@JFValdes 我还在寻找解决方案。AlarmManager 在原生 Android 设备上运行得非常完美。问题是制造商试图“增强” Android 功能,却破坏了 AlarmManager...制造商不应该实现自己的“电池节省器”,如果他们使用标准的 Doze 模式,那么 AlarmManager 就会完美地工作...仍在寻找解决方案... - Sergio Viudes
1
@SergioViudes 我也遇到了在小米设备上进行跟踪的同样问题。如果我将我的应用程序从电池节能限制中排除,那么通过以下设置,在4个设备中有3个可以正常工作 ---> 进入电池 -> 电源 --> 应用程序电池优化 --> 选择你的应用程序 现在选择无限制(用于后台设置),然后允许后台位置选项。 - Imran Khan Saifi
1
有一个网站可以解释如何处理不同制造商的这个问题:https://dontkillmyapp.com - Sergio Viudes
显示剩余15条评论
14个回答

0
你有监听BOOT_COMPLETED吗?当设备重新启动时,你需要重新设置闹钟。

是的,就像我说的一样,闹钟从2012年开始就一直在正常工作,直到现在。当设备重新启动时,我会在BOOT_COMPLETED广播接收器中重新安排闹钟。 - Sergio Viudes
1
需要重新启动应用程序才能使其再次工作,这甚至不是解决问题的一半。 - Tim
1
@TimCastelijns,这完全不是我想说的。如果设备重新启动,则必须重新设置使用alarm manager设置的所有闹钟。 - Tyler Pfaff
@TylerPfaff 是的,但设备的重启与此问题无关。 - Tim

0
这些设备运行的是哪个版本的Android?
自API 23以来,当操作系统被空闲使用了一段时间后,它本身会进入低功耗空闲模式,在该模式下,闹钟将不会触发。然而,应用程序有一种明确的方式来说“我需要在特定时间触发这个闹钟,无论电池使用情况如何”,即使用新的AlarmManager方法setAndAllowWhileIdle()setExactAndAllowWhileIdle()
根据您的描述,这似乎不是某些OEM设备出现问题的特定原因,但所有使用Alarm Manager的开发人员都应该意识到这一点。
最后,许多使用Alarm Manager的用途最好使用Job Scheduler的机制来解决。为了向后兼容,Play Services 的“GCM Network Manager”实际上非常接近于Job Scheduler的功能 - 它在较新版本的Android上内部使用Job Scheduler,并且与网络并不一定相关,尽管类名为网络管理器。

三星设备带有智能管理器正在运行棒棒糖系统。我已经在棉花糖设备上使用setExactAndAllowWhileIdle。我会查看JobScheduler和GCM。无论如何,我不知道问题是闹钟不会响起,还是当闹钟响起时该设备没有被唤醒。 - Sergio Viudes

0

我一直在寻找答案,经过几个小时的搜索,我终于找到了这个:

https://dev59.com/WVwZ5IYBdhLWcg3wROmO#35220476

在简历中,有一种方法可以知道您的应用程序是否被“受保护的应用程序”杀死,这仅适用于华为设备。如果其他设备(三星、索尼、小米等)有任何解决方案,请告诉我。

0

对于小米手机,您可能需要启用应用的自动启动功能。我正在尝试列出一些可能会影响后台进程的 Android 修改(通常来自手机制造商)列表。如果您有新的内容,请在此处添加答案 Android 任务管理器列表


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接