Java 如何在没有频繁轮询的情况下了解GMail上收到的电子邮件?
如果我正在开发一个Android应用程序,最可行的方法是什么来获得关于收到电子邮件的近实时通知?是否有类似推送的机制,或者是否可以长时间保持IMAP连接,或者是否使用IDLE命令?Java 如何在没有频繁轮询的情况下了解GMail上收到的电子邮件?,java,android,oauth,gmail,gmail-imap,Java,Android,Oauth,Gmail,Gmail Imap,如果我正在开发一个Android应用程序,最可行的方法是什么来获得关于收到电子邮件的近实时通知?是否有类似推送的机制,或者是否可以长时间保持IMAP连接,或者是否使用IDLE命令? 考虑到用户被授权通过OAuthTM使用Gmail服务,我不想疯狂地查询IMAP服务器。 更新: 我没有使用谷歌账户中配置的手机。使用OAuth设置了另一个帐户 我正在使用连接到我的应用程序中的IMAP/SMTP。这是一个用于IMAP的基本库,但我可能可以修改它以添加IMAP命令/扩展 你可以在GMail上注册,只要
考虑到用户被授权通过OAuthTM使用Gmail服务,我不想疯狂地查询IMAP服务器。
更新:
- 我没有使用谷歌账户中配置的手机。使用OAuth设置了另一个帐户
- 我正在使用连接到我的应用程序中的IMAP/SMTP。这是一个用于IMAP的基本库,但我可能可以修改它以添加IMAP命令/扩展
contentResolver.registerContentObserver(Uri.parse("content://gmail-ls"), true, myContentObserver );
在您的ContentObserver中覆盖
onChange
,以便在GMail中的某些内容发生更改时执行操作。我想查看谷歌云消息(GCM):
我的理解是,这不需要用户的谷歌帐户,并允许您处理身份验证
请参见此处的教程:
不过,您需要运行额外的服务器端代码来执行此操作。由于IMAP本机提供任何类型的推送通知,而服务器端也不提供,因此您必须自己实现它 一种方法是使用
IDLE
请求,这仍然是一种廉价的轮询方法。当然,你不能期望你的应用程序一直运行,所以你需要使用后台服务。然而,安卓系统上的“常开”服务是一种反模式,它会很快耗尽电池电量,可能会让你获得很多一星级服务。此外,系统可能会在任何时候决定杀死它。另一种选择是使用AlarmManager
定期启动服务,但每隔几秒钟左右启动一次同样糟糕。所以你基本上回到了原点:投票
另一种方法是使用GCM或类似服务获取推送通知。这确实需要你有一个服务器,服务器需要有用户的身份验证信息(这可能是个问题),但在Android端,没有关于保持开放连接和每秒发送空闲等的实际限制。如果你想自己实现推送,您需要保持一个打开的套接字以获取通知。如果您不是一个系统应用程序(见上文),那么这不是很容易做到的,因此只剩下GCM。它使用的连接由系统(谷歌服务框架)管理,它可以做普通应用程序做不到的事情,你基本上可以免费获得它,因为它已经存在了。当有事情要做时,它接收小块数据,称为“挠痒”。这些反过来会触发广播、谷歌播放更新等
所以,你挑吧。或者干脆放弃,注册账号,使用GMail及其标签 这不是一个选项,因为我不使用手机的默认帐户。这是一个选项,可以设置一个服务器进行轮询,然后使用例如GCM将其推送到设备上吗?轮询已结束。服务器端解决方案已过时。手机本机电子邮件工具已过时。你考虑过量子计算吗?谢谢你的建议,但这里是我的标准:1-没有可能导致应用程序失败的外部依赖(邮件服务器本身除外)2-没有存储用户数据或将其发送到其他地方(如果无法看到和控制的服务器端组件可以读取他们的邮箱,用户会感到不舒服。他们可以控制/限制应用程序的通信。)3-不锁定GMail或任何其他邮件服务器(如果安卓用户的主邮件位于Yahoo上,该用户会如何?)这很好,但我不希望使用服务器端组件来保持简单。谢谢,我会仔细查看您提到的选项。请您再详细说明一下“连接('trickle')”部分好吗?我的意思是“挠痒”。请参阅更新的答案,但它基本上是一个始终打开的(如果可能的话)TCP连接。但这是谷歌专有的扩展,因此没有关于实际实现的真正文档。我建议不要尝试实现您自己的推送服务。根据我们的经验,美国运营商可以通过防火墙干扰服务器启动的基于套接字的通信。设备IP在3G、4G、WiFi和ne上也非常动态ed将跟踪这些更改。看起来我将继续使用IDLE(或GCM,取决于身份验证机制)。作为一个用户,我自己也不愿意授予web服务阅读我的收件箱的权限。