关于Android 推送的问题

移动开发 码拜 9年前 (2015-04-26) 1847次浏览 0个评论

现在网上一大堆的关于推送方面的实现原理:
1.通过pull(拉),也就是通过客户端主动定时轮询服务器请求数据。
2.通过push(推),服务器通过一个长连接主动推送消息到客户端。
这两个方式都可以实现推送功能。pull这个方式没什么问题好理解。
主要push的方式,都没有讲的太明白,好多都是在讲要保持一个socket的长连接,这里在android手机的不休眠时,很容易实现。
关键是手机要是休眠了该如何实现?
手机休眠时所有的程序就会停止运行,这时该如何接收服务器推送来的消息?
在网上看到的大多数的想的是用AlarmManager全局定时器来实现定时发心跳包来保持socket的长连接…。但实际是这个是保持不了长连接的。只能是在定时时间到了唤醒cpu时,会连一下服务器,但这个动作一完成cpu会又进入了休眠状态,这时刚刚发起的socket连接就又会被断开。那这么这个socket长连接在cpu休眠时跟本没办法保持。
那QQ和第三方的推送平台又是如何实现在手机休眠后实时的推送消息到手机的?难道在手机休眠后,换为pull(拉),客户端定时轮询的方式?
有做过这方面的大神们来给解答一下…

关于Android 推送的问题
5分
用第三方推送平台会好很多,比如百度云推
关于Android 推送的问题
5分
如果你的消息很大可以考虑用xmpp openfire smack。参考 http://blog.csdn.net/shimiso/article/details/11225873
如果你的要在多终端推送,你就自己实习websocket
关于Android 推送的问题
既然是消息推送就一定是push的方式,用pull不及时而且很浪费电池
关于Android 推送的问题
5分
长连接在手机休眠下也还是会保持的哈,因为主CPU休眠了,还有一个基带处理器来处理基本的操作的。
关于Android 推送的问题
这个主cpu休眠后,BP是在工作也能接收信息,但程序都是运行在AP(主cpu)下的,Socket连接也是运行在cpu下的,当AP休眠时,socket监听也就不工作了。就算BP接收到了信息也没有办法去处理吧。因为测试中,只要手机一休眠服务器发送的消息手机就接收不到了。
关于Android 推送的问题
没人了回答了啊
关于Android 推送的问题
等待大神的回答..
关于Android 推送的问题
刚好路过,的确如楼主所说,Android休眠时移动互联网数据通讯会停止(包括GPRS、WIFI等),BP虽然工作但AP是不工作的,自然无法运行App。所以这时候使用TCP长连接,会不断断开和重连,TCP长连接的意义并不大,建议用UDP。

刚刚发布了开源DDPush任意门推送服务器,csdn的帖子在这里,楼主有兴趣可以看看。

关于Android 推送的问题
5分
推送 服务 一般都是用推送平台  参考相关 API 就可以 
关于Android 推送的问题
引用 8 楼 DDPush 的回复:

刚好路过,的确如楼主所说,Android休眠时移动互联网数据通讯会停止(包括GPRS、WIFI等),BP虽然工作但AP是不工作的,自然无法运行App。所以这时候使用TCP长连接,会不断断开和重连,TCP长连接的意义并不大,建议用UDP。

刚刚发布了开源DDPush任意门推送服务器,csdn的帖子在这里,楼主有兴趣可以看看。

谢谢这位的回答,这个做的很不错。虽然和我想要的有些差别,不过还时十分感谢~!! 

关于Android 推送的问题
 
我想知道推送时,手机端程序如何在手机休眠时,处理接收实时消息及思路?

继续等待大神们的详细回答….

关于Android 推送的问题
50分
引用 10 楼 feikonl 的回复:
Quote: 引用 8 楼 DDPush 的回复:

刚好路过,的确如楼主所说,Android休眠时移动互联网数据通讯会停止(包括GPRS、WIFI等),BP虽然工作但AP是不工作的,自然无法运行App。所以这时候使用TCP长连接,会不断断开和重连,TCP长连接的意义并不大,建议用UDP。

刚刚发布了开源DDPush任意门推送服务器,csdn的帖子在这里,楼主有兴趣可以看看。

谢谢这位的回答,这个做的很不错。虽然和我想要的有些差别,不过还时十分感谢~!! 

谢谢。不知道你要的有些什么具体差别呢?如你所知,android休眠的时候所有工作都会停止,这个是为了省电。但是我们可以通过AlarmManager来唤醒系统(小米手机最短唤醒间隔是5分钟),这样我们的程序就能工作了。但是过于频繁的唤醒会太耗电,所以三五分钟唤醒一次是合适的。

如果是开发即时聊天app之类,有可能第一次的实时消息有延时(实时上我测试过微信也如此,第一次信息有时候会延时三两分钟),因为手机还没被唤醒。一但被唤醒后,大概可以维持几十秒工作时间,这个时候发现有很新的消息,可以保持WakeLock让手机在接下来的3分钟之内(举例而已,未必是3分钟,应该是动态调整)不释放,这样这3分钟之内手机就不会休眠。

为什么要在有最新消息的3分钟不休眠呢?因为这段时间有第二条信息的机率挺大的,那这三分钟之内有信息就可以实时收到。等过了几分钟发现没有新的信息了,那么接下来几分钟有信息的可能就相对小了,就可以释放wakelock让系统休眠了。

这样下来,不实时的情况最多延时一两分钟,剩下的都很实时了,基本就达到了一直在线的效果。如果追求100%时间实时接收信息,我个人认为是不实际的,一来没必要,二来会导致耗电极快。可以下载WakeLock Detector分析微信的行为,你会发现微信唤醒系统的节奏也是几分钟一次,然后会调整休眠的步长。越久没新消息,就可以休眠越久,当然,最久不用超过5分钟。

关于Android 推送的问题
谢谢,各位的回答,虽然有些回答对我没有太有用,但也十分感谢各位的参与。
最后非常感谢DDPush  大神的回答对我来说很有用~~!!
关于Android 推送的问题
请问最后实现了保持长连接吗?我最近也碰到这个问题了,过一段时间客户端自己就掉线了
关于Android 推送的问题
学习了,微信是这个原理哇 

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于Android 推送的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!