2011-05-19 48 views
22

以Gmail应用程序为例。无论手机是否开机,它都会每10分钟轮询一次以下载自上次检查以来可能已到达的新电子邮件。定期在后台进行Android应用程序轮询的最佳方式

我知道如何创建一个新的服务并绑定到它。但我可以看到一些方法来做到这一点:一旦

  • 绑定,并在一个无限循环的服务运行,当它这样做睡了每个循环
  • 绑定和取消绑定右侧10分钟之间,调度不知何故下次绑定在10分钟内
  • 使用AlarmManager类安排未来选举

哪些权衡? Gmail应用程序如何完成它?

谢谢!

+0

Gmail不使用Android Cloud To Device?我想是这样......但这是一个疯狂的猜测,没有任何具体的知识。 http://android-developers.blogspot.com/2010/05/android-cloud-to-device-messaging.html – neteinstein 2011-05-19 00:14:01

+0

@NeTeInStEiN看起来像它一样,我被误认为 – 2011-05-19 00:58:56

回答

18

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

要实施推送,请看C2DM

如果您仍想轮询,推荐的方法是在AlarmManager中设置周期性警报。

UPDATE:谷歌已经过时C2DM与Google Cloud Messaging (GCM)

UPDATE取代了它:谷歌已经过时GCM和替换它与 Firebase Cloud Messaging (FCM)

+2

或者,考虑将Urban Airship或Xtify视为商业服务产品类似C2DM的解决方案。 – CommonsWare 2011-05-19 00:16:50

+0

@CommonsWare有一点要注意的是,如果每个人都实现自己的推送服务,那么整个点就会丢失。我认为我们应该坚持C2DM,不管我们喜欢与否。 – aromero 2011-05-19 00:23:01

+1

“有一点需要注意的是,如果每个人都实现自己的推送服务,那么整个点就会丢失。” - 欢迎您提出意见。 C2DM是Google Labs的一个测试版项目,因此可能缺乏一些公司希望的支持和服务级别保证。 – CommonsWare 2011-05-19 00:27:51

5
  • 对于一个连续的,但不密集的调查一样你在评论的人(在轮询之间的分钟范围内),我会用AlarmManager来实现它。这样你就可以确保手机在不需要唤醒电话的情况下被唤醒,这会破坏你的电池。正如CommonsWare所指出的那样,在代码执行的时候,你仍然需要实现一个唤醒锁,但是只要代码完成,你就可以释放它,避免在等待的时候保持电话打开。有关如何实施它的示例,请参阅他的评论。

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

+3

如果您要完成的工作需要大量的时间,您仍然需要一个'WakeLock',因为警报调用的'BroadcastReceiver'在'onReceive()'中做的不多。请参阅'WakefulIntentService'以获得'WakeLock'工作的一个包装:https://github.com/commonsguy/cwac-wakeful – CommonsWare 2011-05-19 00:17:10

+0

@CommonsWare你是对的,但我想说的是,你不需要在做*无*时请保持电话开启。顺便说一句,这是一个很棒的演示。我会详细研究它。 – Aleadam 2011-05-19 00:25:19

+0

哦,我完全同意 - 只是观看时钟刻度的永久服务是一种反模式。我只是对“无需唤醒”部分进行了一些调整,就是这样。 – CommonsWare 2011-05-19 00:28:31

相关问题