Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有频繁轮询的情况下了解GMail上收到的电子邮件?_Java_Android_Oauth_Gmail_Gmail Imap - Fatal编程技术网

Java 如何在没有频繁轮询的情况下了解GMail上收到的电子邮件?

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上注册,只要

如果我正在开发一个Android应用程序,最可行的方法是什么来获得关于收到电子邮件的近实时通知?是否有类似推送的机制,或者是否可以长时间保持IMAP连接,或者是否使用IDLE命令?
考虑到用户被授权通过OAuthTM使用Gmail服务,我不想疯狂地查询IMAP服务器。

更新:

  • 我没有使用谷歌账户中配置的手机。使用OAuth设置了另一个帐户
  • 我正在使用连接到我的应用程序中的IMAP/SMTP。这是一个用于IMAP的基本库,但我可能可以修改它以添加IMAP命令/扩展
你可以在GMail上注册,只要GMail有什么变化,观察员就会被呼叫

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服务阅读我的收件箱的权限。