我已经使用后台服务来更新任务,例如在我的Android应用程序中频繁播放网络服务器(发送地理位置数据或发送/获取网络数据),我也有为此遇到了许多问题(进程缓慢,应用程序挂起)。
但是在我目前的应用程序中,我使用了AlarmManager,然后是PendingIntents来完成一些运行良好的任务。 所以我认为如果我用AlarmManager后跟PendingIntents替换每个使用服务的更新任务都是好的。
这是正确的方式还是我要犯一个大错?
所有建议都很明显。 提前致谢。
答案 0 :(得分:1)
使用AlarmManager
安排的服务和警报有时会提供不同但互补的用途。使用set
方法之一计划警报时,将在指定时间触发警报,您应在BroadcastReceiver
处理警报。这意味着您的处理必须是响应式的,不能进行异步操作。 According to the docs:
BroadcastReceiver对象仅在对onReceive(Context,Intent)的调用期间有效。一旦你的代码从此返回 功能,系统认为要完成的对象不再 活性。 (...)任何需要异步操作的东西都不是 可用,因为您需要从函数返回来处理 异步操作,但此时BroadcastReceiver是 不再活跃,因此系统可以自由地杀死它的进程 在异步操作完成之前。
如果您想处理更复杂的操作,建议您启动服务。即使您在接收器上使用最近可用的goAsync()
电话,仍然需要be responsive:
这不会改变对广播相对敏感的期望(在10秒内完成)
所以它最终取决于你想要达到的目标,何时使用它们或将它们结合使用。
答案 1 :(得分:0)
我不是说使用Alaram Manager是一个很大的错误。
现在要运行后台服务,只有很少的选项,简单且部分可靠的是AlarmManager。
虽然有时Alarm Manager is not 100% reliable
查看其他类别来执行这些操作(例如Asynchronous Thread
和delay looping
技术),但后台服务的复杂程度要高得多。
当我们比较后台服务所需技术的优缺点时,AlarmManager赢得了比赛。
我更喜欢 AlarmManager
在考虑现在打开的选项以完成后台任务时,对于这类后台服务是个不错的选择。
希望Google能够提供更好的解决方案来处理后台服务。