在后台定期轮询Android应用的最佳方式

Bri*_*ong 23 android

以Gmail应用程序为例.无论手机是否开启,它都会每10分钟左右轮询一次,以便下载自您上次检查后可能已到达的新电子邮件.

我知道如何创建一个新服务并绑定它.但我可以看到几种方法来实现这一目标:

  • 绑定一次,让服务在无限循环中运行,在每个循环之间休眠10分钟
  • 完成后绑定和取消绑定,在10分钟内以某种方式安排下一个绑定
  • 使用AlarmManager类来安排未来的民意调查

有什么权衡?Gmail应用如何实现这一目标?

谢谢!

aro*_*ero 18

Gmail应用使用推送,而不是轮询.我建议使用这种技术,轮询是移动设备中的电池杀手.

要实现推送,请查看C2DM.

如果您仍想轮询,建议的方法是在AlarmManager中设置定期警报.

更新:Google已弃用C2DM并将其替换为Google云消息传递(GCM)

更新:Google已弃用GCM并将其替换为 Firebase云消息传递(FCM)

  • 或者,将Urban Airship或Xtify视为商业服务,为C2DM提供类似的解决方案. (2认同)

Ale*_*dam 5

  • 对于一个连续的,但不是密集的民意调查,如你评论的民意调查(在民意调查之间的分钟范围内),我会用AlarmManager实现它.通过这种方式,您可以确保手机在不需要唤醒锁的情况下唤醒,这会破坏您的电池.正如CommonsWare指出的那样,你仍然需要在你的代码执行时实现一个唤醒锁,但你可以在代码完成后立即释放它,避免在等待时保持手机开启.有关如何实现它的示例,请参阅他的评论.

  • 如果您需要在较短的时间内(每次轮询之间的秒数)进行更快的轮询,我会使用服务,因为设置警报对于如此短的时间段没有意义,并且电池无论如何都会耗尽.

  • 你仍然需要一个`WakeLock`,如果你要做的工作花费了大量的时间,因为报警调用的`BroadcastReceiver`在`onReceive()`中不能做太多.请参阅`WakefulIntentService`获取围绕`WakeLock`工作的一个包装:https://github.com/commonsguy/cwac-wakeful (3认同)
  • @CommonsWare我相应地编辑了这篇文章. (3认同)