AlarmManager不能在多个设备上工作
我的应用程序使用AlarmManager,从4年前开始工作。 但是我注意到它在一些设备上开始失败。
我敢肯定,代码是正确的(我使用WakefulBroadcastReceiver,并设置有效的AndAllowWhileIdle设备与打盹),因为它在Nexus设备上完美的工作,但它在一些制造商(华为,小米…)的设备失败。
例如,华为设备有一种杀死应用的电池pipe理器,当一个应用被杀死时,预定的告警被取消。 因此,在华为电池pipe理器中将应用设置为“受保护”即可解决问题。
但是最近我注意到它没有使用更多的设备:小米,三星(也许它与新的“智能pipe理器”有关?)…似乎这种行为正在成为一个标准:杀死后台应用程序。
任何人都知道吗? 任何方式来确保警报被解雇?
问题是智能pipe理器。 三星有一个电池pipe理器,有时会禁用某些应用程序在后台运行。 它试图回到应用程序“恢复”,但完全禁用应用程序或可能会恢复每5分钟左右(取决于三星如何)。
这将适用于股票版本的Android,因为没有三星pipe理器。 你也可以安装自定义版本的Android,它具有一些function来启用SM(取决于ROM)。
我正在努力解决它几个星期了。 我什么也没find。 华为在一段时间之后杀死了所有的告警。 如果我把应用程序放在电池保护程序中的受保护的应用程序,这不会有帮助。 但是,如果我改变我的应用程序的包名称,以包含像闹钟,时钟或日历这样的词,它就像任何其他设备上一样正常工作。 我不明白Google如何为这个垃圾提供authentication。 我认为OEM不应该这样修改核心平台。 我明白,他们有自己的电池保护程序,杀了一段时间后,当用户不使用它的应用程序。 但是这个杀毒警报也是受保护的应用程序
另外setAlarmClock()为确切的定时警报帮助。 但是这不可能用于像小部件更新这样的想法。
我刚刚停止使用AlarmManager …一个更好,更稳定的替代scheme
- 创build一个服务
- 为BOOT_COMPLETED注册BroadcastReceiver
- 从接收器中解放你的服务
- 在你的服务中启动一个新的Handler,每X分钟循环一次( Android – 使用postDelayed()调用定期运行一个方法 )
- 检查执行任务的时间是否已经到了:now – 执行时间> 0( 如何findjava中两个date之间的差异的持续时间? )
- 如果是的话……执行任务并停止处理程序
是的..这是一个痛苦..但工作完成无论如何
你在听BOOT_COMPLETED吗? 设备重启时,需要重新设置告警。
我也有一个设置闹钟的应用程序。解决scheme是在api> = 21上使用AlarmManager.setAlarmClock() 。这不会受到打扰afaik的影响,还有在系统托盘中放置闹钟图标的额外好处。
将AlarmManager用于<5.0设备,JobScheduler用于5.0+设备。 我不能肯定地说JobScheduler不会受到制造商诡计的影响,但对我来说这似乎不太可能,因为Android试图将人们从AlarmManager移到JobScheduler。
现在大多数新手机都与某种电池/省电pipe理器捆绑在一起。 不计算放荡者和干净的主人。
我认为您需要在您的应用/ Play商店列表中放入免责声明或常见问题解答,指出此应用需要放入电池pipe理器应用的例外状态才能正常工作。
这些设备运行的是什么版本的Android?
从API 23开始,操作系统本身在闲置一段时间后会进入低功耗空闲模式,在这种模式下,警报将不会被传送。 然而,应用程序有一种方法可以明确地说出:“无论电池使用情况如何,我都需要此警报才能closures”。 新的AlarmManager方法称为setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
。
从您的描述中可以看出,这可能不是您在某些原始设备制造商设备上问题的具体原因,但这是所有使用报警pipe理器的开发人员都应该注意的事情。
最后,使用Job Scheduler的机制可以更好地解决Alarm Manager的许多用法。 为了向后兼容,播放服务“GCMnetworkingpipe理器”实际上与作业调度程序的function非常接近 – 在较新版本的Android中内部使用作业调度程序 – 并不一定是关于networking,尽pipe该类的名称。
我不认为杀死应用程序会阻止警报pipe理器唤醒您的应用程序。
它只有当你“强行停止”或禁用应用程序,你没有收到来自报警pipe理器的回叫。
根本原因可能是别的。
另外在M … setExactAndAllowWhileIdle不会遏制…这是如果你安排一个警报每2分钟它将不会被触发。 需要15分钟的窗口。 。
对于小米,您可能需要为您的应用程序启用AutoStart。 我正在尝试做一个Android修改列表(通常来自手机的制造商),可能会影响后台进程。 如果你有新的东西,请在这里添加一个答案Android任务杀手的列表
我们需要启用我们的应用程序在自动启动pipe理器在应用程序pipe理器,一些手机像体V5,
在体内v5中,我们可以在iManager – > App Manager – > Auto Start Manager中find这个菜单。 启用我们的应用程序
然后,如果应用程序被终止或closures,则警报/警报pipe理器将触发警报。
我正在寻找答案,几个小时后,我发现这一点:
https://stackoverflow.com/a/35220476/3174791
简历是了解您的应用程序是否被“受保护的应用程序”杀死的方法,这只适用于华为设备。 让我知道如果有其他设备(三星,索尼,小米等)的任何解决scheme。