谷歌是如何实现他们的推送通知功能的?它是通过后台运行的服务进行轮询还是以不同的方式工作?
我在以色列的Android开发者大会上听到:
在云谷歌服务器上,只有一个TCP套接字以接受模式等待。日志含义谷歌Play应用程序已启动TCP连接。这就是为什么谷歌播放必须安装在设备上,使谷歌云消息(GCM)(以前的Android云到设备消息服务- C2DM)工作。
当这个TCP客户端套接字接收到一些消息时,该消息包含了诸如应用程序的包名等信息,当然还有数据本身。这些数据被解析并打包到一个意图中,该意图被广播并最终被应用程序接收。
即使设备的无线电状态变为“空闲”模式,TCP套接字也保持打开状态。应用程序不需要运行来接收意图。
更多信息请访问http://developer.android.com/google/gcm/gcm.html
你可以在android上使用长轮询tcp连接来实现推送通知。 但这将涉及维护一个额外的插座=>电池耗尽。 或者你也可以使用Alarm Manager定期打开一个连接。
谷歌可能为所有C2DM推送通知打开一个插座,因此它更省电。
Android与谷歌的服务器保持着一个活动连接,但它不会消耗太多电力或数据,因为在有东西向你手机上的应用程序发送谷歌云消息(GCM)之前,没有流量通过它发送。手机上只有一个连接,所有应用程序都使用:安装一个使用GCM的新应用程序不会增加任何额外的负载。
The first step in GCM is that a third-party server (such as an email server) sends a request to Google's GCM server. This server then sends the message to your device, through that open connection. The Android system looks at the message to determine which app it's for, and starts that app. The app must have registered with Android to use GCM, and it must have the relevant permission. When the app starts, it might create a notification straight away with the data from the message. GCM messages are very limited in size, so the app might instead open a normal connection to the third-party server to get more information (for example, downloading the headers of new emails).
使用推送通知的好处是,应用程序不需要定期运行来检查新数据,既省电又省数据。拥有像GCM这样的集中式机制的优势在于,设备只需要一个开放的网络连接,而Android GCM系统是唯一需要保持运行的系统,而不是每个应用程序都必须在后台运行以保持与自己服务器的网络连接。
这是从:来源 也可以看这里。
截至2018年4月10日,谷歌已弃用GCM。GCM服务器和客户端api已弃用,最早将于2019年4月11日移除。将GCM应用程序迁移到Firebase Cloud Messaging (FCM), FCM继承了可靠和可扩展的GCM基础设施,以及许多新功能。
https://firebase.google.com/docs/cloud-messaging/
推荐文章
- 在XML中“图像上缺少contentDescription属性”
- 在Android SQLite中处理日期的最佳方法
- 读取Android APK的包名
- Android-Facebook应用程序的键散列
- 登出时,清除活动历史堆栈,防止“返回”按钮打开已登录的活动
- 如何改变标题的活动在安卓?
- 如何隐藏动作栏之前的活动被创建,然后再显示它?
- 是否有一种方法以编程方式滚动滚动视图到特定的编辑文本?
- 在Android中将字符串转换为Uri
- 如何在NestedScrollView内使用RecyclerView ?
- 移动到另一个EditText时,软键盘下一步点击Android
- Android应用中的GridView VS GridLayout
- Activity和FragmentActivity的区别
- 右对齐文本在android TextView
- 权限拒绝:start前台需要android.permission.FOREGROUND_SERVICE