如何在不经常轮询的情况下了解GMail上收到的电子邮件?

时间:2012-10-19 02:06:46

标签: java android oauth gmail gmail-imap

如果我正在开发Android应用程序,那么接收有关传入电子邮件的实时通知的最可行方法是什么?是否有推式机制,或者我可以长时间保持IMAP连接,还是使用IDLE命令?
考虑用户有权通过OAuth使用GMail服务,我不想疯狂地轮询IMAP服务器。

更新:

  • 我没有使用手机配置的Google帐户。使用OAuth设置了另一个帐户。
  • 我正在使用Apache Commons Net连接到我的应用中的IMAP / SMTP。它是IMAP的一个裸骨库,但我可以修改它以添加IMAP命令/扩展。

3 个答案:

答案 0 :(得分:3)

你可以用GMail注册一个ContentObserver,只要GMail发生变化,就会调用观察者。

contentResolver.registerContentObserver(Uri.parse("content://gmail-ls"), true, myContentObserver ); 

覆盖您的ContentObserver中的onChange,以便在GMail中的内容发生变化时执行操作。

答案 1 :(得分:2)

我会查看Google Cloud Messaging(GCM):

http://developer.android.com/training/cloudsync/gcm.html

我的理解是,这不需要用户的Google帐户,并允许您处理身份验证。

请参阅此处的教程:

http://www.techrepublic.com/blog/app-builder/implementing-googles-cloud-to-device-messaging/428

您需要运行其他服务器端代码才能执行此操作。

答案 2 :(得分:2)

由于IMAP本身提供任何类型的推送通知,而Google extensions也没有,因此您必须自己实现。

一种方法是使用IDLE请求,这仍然是一种廉价的轮询方式。当然,您不能指望您的应用始终在运行,因此您需要使用后台服务。然而,“永远在线”服务是Android上的一种反模式,可以快速耗尽电池,并可能为您带来许多1星级。此外,系统可以决定随时杀死它。另一种方法是使用AlarmManager定期启动服务,但每隔几秒左右启动一次也同样糟糕。所以你基本上回到原点:民意调查。

另一种方法是使用GCM或类似服务获取推送通知。这确实需要你有一个服务器,服务器需要有用户的身份验证信息(这可能是一个问题),但是没有关于保持打开连接和每秒发送IDLE的真正限制,等等。在Android上另外,如果你想自己实现推送,你需要保持一个打开的套接字来获取通知。如果您不是系统应用程序(见上文),这不是很容易做到的,所以离开GCM。它使用的连接由系统(Google服务框架)管理,它可以做常规应用程序无法做到的事情,你基本上可以免费获得它,因为它已经存在。当有事情要做时,它会收到一小段数据,称为“痒痒”。这些反过来会触发广播,Google Play更新等。

所以,请选择。或者只是放弃,注册帐户并使用GMail及其标签Android API