可恶之极!“我的移动” 极路由器设置移动硬盘里却无法改变“推送信息”,移动变不动,无耻!

为什么手机不连无线网就收不到消息通知啊?移动数据也打开了,设置里的通知也打开了_百度知道
为什么手机不连无线网就收不到消息通知啊?移动数据也打开了,设置里的通知也打开了
我有更好的答案
是北京的吗?我这几天也有这个问题,用移动流量接受不到消息提示,开了Wi-Fi推送消息就都来了
是啊!都不知道怎么回事
我还怀疑是不是我手机坏了
估计是北京移动的问题吧,我外地的移动卡在这里也收不到推送消息,要不打客服问问,对了你的也是iPhone吧?
在外地就能收到吗?
我的也是前天才开始不推送的,之前一切正常啊,楼主如果解决了请教教我
采纳率:100%
有的浏览器有wifi下看图高清流量下智能无图的模式,所以你看看你的应用有没有wifi下就推送流量下不推送的设置
你那程序后台运行没
后台运行了,我把软件卸载了重新下载还是不行
我想到两情况,1.你打开软件后不要清理后台服务,或者你手机有软件会自动清理后台服务,举例:你退出QQ后QQ依旧在后台服务占用内存。2.杀毒拦截?这个不太可能吧
本回答被网友采纳
后台没有运行
可能系统问题,推送会延迟
不连无线,一天都没有一个消息,非得点开才会有新消息
看看是不是缓存的问题
在哪里看啊?
我手机上没有
你看看你的那个。退出qq时是否接受消息
退出了,也不行,一连上无线全都能收到
就是你退出设置是不接受消息啊亲
离线不接受
没退出也接受不到
其他1条回答
为您推荐:
其他类似问题
无线网的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。注册 | 登录
微信公众号:临公子的后花园
产品经理就业特训营,专门为大学生和准备转型做产品的人量身定制,60天线下培训,包就业!
几乎每一个移动APP中都或多或少包含了消息推送的功能,在协同类工具中更是如此,不同角色、不同时间点、不同渠道、不同的信息等交织在一起,往往在分析和设计时让人觉得纵横交错。其实,只要静下心划分好需要做的区域,再各个击破细化,设计较为复杂的消息推送机制并没有那么困难。今天就以协同中很常见的某种单据审批功能做个实例。
一、开始设计之前
老规矩,请先不要急着打开Axure。
由于面向协同办公人员,与普通APP的消息推送对象有很大区别,普通APP的消息推送更多是作为产品运营渠道,而在办公流程中需要更多考虑业务流程如何打通、各类分支如何聚合、不同流程中的状态变更、什么样的角色在什么场景收到什么信息等等。把这些需要解决的问题先清晰地罗列整理出来。
二、框架流程长什么样?
原型也好,细节说明也罢,其实最终都会映射至业务流程中,协同类的流程更是如此,一个框架性的流程图包含人员角色、操作、状态变更等多个属性。根据框架流程,后续可逐步针对环节再细化分支流程。
业务流程是重点,因为这是直接目标导向的,让我们知道这个功能到底是为了做什么,是怎么一步步实现这个目标的。流程除了说明逻辑关系以外,可以将操作的角色以及单据流转时的状态变更一一对应(其实也就我们常说的:谁、什么时候、做了什么),这样能够让团队成员对整体流程闭环有更全面的了解。
三、消息推送规则
消息推送机制由服务端实现,需要考虑到内部及外部的触发原因,再具象来说就是操作触发及自动触发(比如状态变更引起的触发机制)。再者考虑推送的对象,消息并不是面向所有人员都push的,要让通知消息在正确的时间、正确的场景到达正确的人手中,以确保消息的有效性。
这里不得不说一下场景化的事儿。在需求评审的时候,大家往往会抛出各种各样的场景:“XX人员要是他自己就是想知道呢?”、“我觉得删除后会不会还想要把信息找回?”、“要是小明手机没带就收不到了。。。”我们在考虑场景的时候,经常会想象出一些发生频率很低的极端场景,然后为了满足少部分人的需求而牺牲了多数人的操作体验。“场景化”应该是具有典型性而非全面性的,从来不需要做一个让任何人用的都满意的产品(其实也做不到),而需要做让大部分用户觉得满意即可。因此相比于可能发生但很少出现的情况,更需要考虑的是高频场景。
四、梳理共性字段
对于多类型单据组成的功能模块而言,在需求分析时抓出共性部分能够有效提高后续制作原型以及开发实现时间。有规律,才有效率。另外在说明字段的时候,尽量不要把一堆文字洋洋洒洒铺了一屏,开发看了也累,可以以表格方式体现,如果能附上对应的页面原型就更好了。毕竟在展示中,字不如表,表不如图。
其他:基于模块的页面结构说明
将一些机制规则梳理好后,后续就是在页面原型设计中将这些规则融入。
由于各表单都基于结构化框架,因此在页面展示也上存在许多共性部分,这时候可以针对模块,设计出全局通用的页面结构说明。将复用的页面部分整理出来,至于用什么形式——以项目团队接受的方式即可(这时候才开始用Axure画原型)。
根据该模块的通用页面结构,划分了上中下三个区域,并对每个区域中的共性部分进行说明(顺便说个题外话,因为之前发现开发有时会忽视下方具体的页面交互说明,所以当原型页面刚好占了一屏的时候,我就会放右下方那个“To Dear Coder”的小tip提醒一把)。
页面通用结构的具体交互说明,主要是规约页面上一些相同的操作交互,便于开发可带着模块全局观去查看每个不同类型单据中的区别功能需求点。规则也好,页面也罢,都是先抓共性,再看差异。
之前朋友曾调侃,APP消息推送机制不就是push几个消息嘛。Push消息是没有错,不过那是对用户而言,背后可不仅仅是服务端设置几个参数这么简单——“看起来优雅的天鹅,在水面下却拼命的划水”也是这个道理。要想让用户在适合的场景下得到自己需要的信息,还是得乖乖从业务流程、推送规则、字段信息、结构设计等方面梳理,同时将推送机制融合至模块功能和用户场景中,从而保证信息推送的有用性和有效性。
对于一个产品汪而言,逻辑能力往往比页面设计能力重要(当然原型设计也是基础),但由于原型图是表现层的产物,大家往往忽视页面背后的实现机制。其实很多时候就像修路,把每一个砖头都稳稳的铺好,自然就会形成一条路。
作者:临公子(微信号公众号:临公子的后花园),一枚喜欢理财、健身、不爱灌鸡汤喜欢喝咖啡的美汪。
本文由 @临公子 原创发布于人人都是产品经理。未经许可,禁止转载。
赞赏是对原创者的最大认可
收藏已收藏 | 212赞已赞 | 25
微信公众号:临公子的后花园
产品经理群运营交流群营销交流群
文案交流群
Axure交流群
区块链学习群
关注微信公众号
24个回答23人关注
19个回答16人关注
11个回答15人关注
12个回答12人关注
19个回答57人关注
11个回答20人关注更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
极品渣男抛妻弃子,涂磊怒斥无耻男,骂得太犀利了
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
, 可在设置中重新打开噢!
30秒后自动关闭
极品渣男抛妻弃子,涂磊怒斥无耻男,骂得太犀利了">极品渣男抛妻弃子,涂磊怒斥无耻男,骂得太犀利了
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
可恶无耻的小偷的嘴脸,都来抓小偷啊!!!
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
, 可在设置中重新打开噢!
30秒后自动关闭
可恶无耻的小偷的嘴脸,都来抓小偷啊!!!">可恶无耻的小偷的嘴脸,都来抓小偷啊!!!
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制Android实现推送方式解决方案
本文介绍在中实现推送方式的基础知识及相关解决方案。推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的最新的新闻信息。这种推送功能是好的一面,但是也会经常看到很多推送过来的垃圾信息,这就让我们感到厌烦了,关于这个我们就不能多说什么了,毕竟很多商家要做广告。本文就是来探讨下Android中实现推送功能的一些解决方案,也希望能够起到抛砖引玉的作用。^_^
  1.推送方式基础知识:
  在移动互联网时代以前的手机,如果有事情发生需要通知用户,则会有一个窗口弹出,将告诉用户正在发生什么事情。可能是未接电话的提示,日历的提醒,或是一封新的彩信。推送功能最早是被用于Email中,用来提示我们新的信息。由于时代的发展和移动互联网的热潮,推送功能更加地普及,已经不再仅仅用在推送邮件了,更多地用在我们的APP中了。
  当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如《地震应急通》就需要及时获取服务器上最新的地震信息。要获取服务器上不定时更新的信息,一般来说有两种方法:第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。?
  虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。??
  在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息。我们只需要在Android或IPhone的通知栏处向下一拉,就展开了Notification Panel,可以集中一览各种各样通知消息。目前平台上已经有了比较简单的和完美的推送通知解决方案,我会在以后详细介绍IPhone中的解决方案,可是Android平台上实现起来却相对比较麻烦。
  最近利用几天的时间对Android的推送通知服务进行初步的研究,也希望能和大家共同探讨一下。
  2. 几种常见的解决方案实现原理:
  1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。
  2)SMS(Push)方式:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,我们需要向移动公司缴纳相应的费用。我们目前很难找到免费的短消息发送网关来实现这种方案。
  3)持久连接(Push)方式:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。IOS平台的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过刚才也讲了,这个方案存在着很多的不足之处,就是我们很难在手机上实现一个可靠的服务,目前也无法与IOS平台的推送功能相比。
  Android操作允许在低内存情况下杀死系统服务,所以我们的推送通知服务很有可能就被操作系统Kill掉了。 轮询(Pull)方式和SMS(Push)方式这两个方案也存在明显的不足。至于持久连接(Push)方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。
  3.第一种解决方案:C2DM云端推送功能。
  在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能,并将其带入自己的项目中。?
  Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。关于C2DM具体使用过程,大家可以去查阅相关的资料,在这里先让我们了解下大致方案情况。
  下面是C2DM操作过程示例图:
  但是经过一番研究发现,这个服务存在很大的问题:
  1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;
  2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;
  3) 不像在iPhone中,他们把硬件系统集成在一块了。所以对于我们开发者来说,如果要在我们的应用程序中使用C2DM的推送功能,因为对于不同的这种硬件厂商平台,比如摩托罗拉、华为、中兴做一个手机,他们可能会把Google的这种服务去掉,尤其像在国内就很多这种,把Google这种原生的服务去掉。买了一些像什么山寨机或者是华为这种国产机,可能Google的服务就没有了。而像在国外出的那些可能会内置。
  有了上述几个方面的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习资源让我们有个参考的资料。 即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。
  4. 第二种解决方案:MQTT协议实现Android推送功能。
  采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
  wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从这里(https://github.com/tokudu/AndroidPushNotificationsDemo)下载该项目的实例代码,并且可以找到一个采用书写的服务器端实现(https://github.com/tokudu/PhpMQTTClient)。
  架构如下图所示:
  wmqtt.jar 是IBM提供的MQTT协议的实现。我们可以从如下站点下载(http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg)它。我们可以将该jar包加入自己的Android应用程序中。
  5.第三种解决方案:RSMB实现推送功能。
  Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。
  SAM是一个针对MQTT写的PHP库。我们可以从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它.
  send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。
  6. 第四种解决方案:XMPP协议实现Android推送功能。
  这是我希望在项目中采用的方案,因为目前它是开源的,对于其简单的推送功能它还是能够实现的。我们可以修改其源代码来适应我们的应用程序。
  事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。关于XMPP协议我在上篇博文中已经介绍,大家可以参考下文章:http://www.cnblogs.com/hanyonglu/archive//2378956.html
  androidpn是一个基于XMPP协议的java开源Android push notification实现,我会在以后的博文中详细介绍androidpn。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读。
  这是androidpn的项目主页:http://sourceforge.net/projects/androidpn/
  androidpn实现意图如下图所示:
  androidpn 客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服 务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。
  androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与 openfire是不同的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的 XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,
负责接收用户的Web请求。服务器架构如下:
  最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。
  这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。 采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。
XMPP协议书相对来说还是比较简单的,值得我们进一步研究。
  但是在经过一段时间的测试,我发现关于androidpn也存在一些不足之处:
  1. 比如时间过长时,就再也收不到推送的信息了。
  2. 性能上也不够稳定。
3. 如果将消息从服务器上推送出去,就不再管理了,不管消息是否成功到达客户端手机上。
  等等,总之,androidpn也有很多的缺点。如果我们要使用androidpn,则还需要做大量的工作。
  至于详细使用过程,我们会在下个博文中再给大家介绍。
  7.第五种解决方案:使用第三方平台。
  第三方平台有商用的也有免费的,我们可以根据实现情况使用。关于国内的第三方平台,我感觉目前比较不错的就是极光推送。关于极光推送目前是免费的,我们可以直接使用。关于详细情况,大家可以查看它的主页:http://www.jpush.cn/index.,这里不再详细描述。
  关于国外的第三方平台我也见过几个:http://www.push-notification.org/。有兴趣的朋友可以查阅相关信息。使用第三方平台就需要使用别人的服务器,关于这点,你懂的。
  8.第六种解决方案:自己搭建一个推送平台。
  这不是一件轻松的工作,当然可以根据各自的需要采取合适的方案。
  好了,以上是关于在Android中实现推送方式的基础知识及相关解决方案。
http://www.infoq.com/cn/articles/baidu-android-cloud-push
http://www.cnblogs.com/hanyonglu/archive//2378971.html
一、推送服务简介
消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息。在Android开发中,这里的发起方我们把它叫做推送服务器(Push
Server),接收方叫做客户端(Client)。相比通过轮询来获取新消息或通知,推送无论是在对客户端的资源消耗还是设备耗电量来说都比轮询要好,所以,目前绝大多数需要及时消息推送的App都采用Push的方式来进行消息通知。
身在天朝,置身墙内!Android生态系统原本提供了类似于Apple iOS推送服务APNS的GCM(Google
Cloud Messaging for Android),以前叫C2DM,但是由于某些原因,导致这项服务在国内不是很好使,为了弥补这个不足,并且我朝各大同胞又想使用Android推送服务,所以国内各大平台陆续推出了GCM的替代品,今天要介绍的就是其中一家,由百度提供的云推送。另外,国内做消息推送服务的还有极光推送和个推等,他们的客户包括新浪微博、淘宝等国内一线大公司。
推送的实现技术简单来说就是利用Socket维持Client和Server间的一个TCP长连接,通过这种方式能大大降低由轮询方式带来的Device的耗电量和数据访问流量。目前,百度云推送提供的推送服务支持的单一消息体大小是4k,如果超过4k,则建议在消息内携带服务请求URL进行二次请求。目前,百度云推送针对Android端提供通知推送,文本消息推送以及富媒体推送。
二、使用场景
1. 单播消息推送
Push Server向指定的设备(Device)或是用户(User)推送消息,一个用户对应一个userID,一个User可能拥有多台Device,我们希望向同一个userID推送消息时,他所有绑定了userID的Device都能收到消息。百度云推送给出的解决方案是通过Client向Push
Server注册,并在Client端的监听端口取得Push Server返回的 channelID和userID,channelID指定一个终端,在向Push
Server注册的过程中,Device可以发送IMIE码或者UUID作为唯一标示,在Push Server注册后再返回给Client生成的channelID和userID。这两个ID获取到后由开发者自行维护,注册完毕后,Push
Server维护一个注册设备列表,这个列表维护了userID和channelID以及与Device对应的关系,当需要向指定的设备或用户推送消息时,Push
Server会首先遍历这个设备列表,通过这两个ID来做唯一性判断并找到需要推送消息的Device,然后就可以进行消息推送了。
实例:用户A发表问题时,记录问题id及其对应的A的userID(或channelID),用户B发表问题回答时,通过服务端API向问题id对应的userID(或channelID)指向的Device推送答案。
2. 分组消息推送
百度云推送通过对Client设置标签(Tag)的方式来进行用户分组,Tag的产生方式可以是由Client维护也可以由Server收集,Push Server针对不同的Tag进行推送过滤,最终将消息推送到指定的Client。无论是由Client主动设置的Tag还是由Server根据用户使用习惯收集的,都由Push Server进行统一管理,在基于Tag的分组消息推送实现上,Push Server首先根据指定Tag从所有Tag下遍历出的对应的已注册的Device,从而可以获得与Device对应的userID和channelID,继而可以针对指定Tag进行分组消息推送。对比单播消息推送,分组消息推送在推送周期上势必要长一些,并且在待推消息列表的维护上也需要做一些处理,哪些消息是推送成功的,哪些是失败的,这需要接收消息推送的Client在接收到消息后给Push
Server一个消息回执,这样就保证了消息送达的准确性,如果消息推送失败,则分组列表里的待推消息会继续推送,直到推送消息成功。另外,在消息推送的实时性上,分组消息推送对比单播消息推送会根据分组消息队列的先后存在一个消息接收的延时,好比现在微信公众账号的推送,就是一个分组消息推送的实例,在消息接收的时效性上对比单播推送存在一定的延时性。
另外,还有一类消息推送使用场景,就是广播消息,该类型可以理解为分组消息的一个特列,即向所有的Tag对应的Client推送消息。广播消息是对全体集合的一个消息推送,在消息队列维护和消息推送时效性上比单个或几个Tag的分组推送成本要高。
实例:给应用提供喜好设置页面,用户勾选不同的类别,触发对应Tag的设置,这种方式是由Client主动维护Tag。或者用户阅读了某个类别的,触发对应Tag的设置,在服务端,给指定类别的图书设置Tag,后续会根据服务端收集的Tag给应用推送该Tag下的新书信息,这种方式就是由服务端来维护Tag分组。
三、百度云推送Android_SDK
百度提供了完整的Demo帮助开发者集成云推送服务,推送服务SDK通过.jar包和.so文件的方式可以集成到我们自己的工程中。在此之前,需要到百度开发者中心进行应用注册并获取API
Key,这个作为使用推送服务应用的唯一标示,具体流程我就不赘述了,需要使用的话可以直接访问百度开发者中心进行查看。
下面主要看看Android_SDK的整体概览和内部运行机制:
上图是百度云推送Android_SDK的框架图,通过SDK可以绕过复杂的Push HTTP/HTTPS API直接和Push服务器进行交互,主要提供如下功能:
Push服务初始化以及Client注册绑定
创建或删除标签(Tag)
接收Push Server的通知并提供自定义展现消息方式
推送统计分析功能,包括通知的点击和删除统计以及应用使用情况统计
富媒体推送
在Android端,总共实现了三个Receiver和一个Service,其中,一个Receiver是用来处理注册绑定后接收服务端返回的channelID等信息:
第二个Receiver是用于接收系统消息以保证PushService正常运行:
第三个Receiver就是开发者自己实现的用来接收并处理推送消息:
一个Service就是在后台运行的用于保障与Push Server维持长连接并做相关处理的后台服务:
在开发者自己需要处理的广播接收器中,可以对接收到的推送消息进行处理,Push消息通过 action为com.baidu.android.pushservice.action.MESSAGE的Intent把数据发送给客户端your.package.PushMessageReceiver,消息格式由应用自己决定,PushService只负责把服务器下发的消息以字符串格式透传给客户端。接口调用回调通过action为com.baidu.android.pushservice.action.RECEIVE的Intent
返回给your.package.PushMessageReceiver。
PushMessageReceiver.java
* Push消息处理receiver
* @Author Ryan
下午5:59:38
public class PushMessageReceiver extends BroadcastReceiver {
public static final String TAG = PushMessageReceiver.class.getSimpleName();
public void onReceive(final Context context, Intent intent) {
if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
//获取消息内容
String message = intent.getExtras().getString(
PushConstants.EXTRA_PUSH_MESSAGE_STRING);
//消息的用户自定义内容读取方式
Log.i(TAG, "onMessage: " + message);
} else if (intent.getAction().equals(PushConstants.ACTION_RECEIVE)) {
//处理绑定等方法的返回数据
//PushManager.startWork()的返回值通过PushConstants.METHOD_BIND得到
//获取方法
final String method = intent
.getStringExtra(PushConstants.EXTRA_METHOD);
//方法返回错误码。若绑定返回错误(非0),则应用将不能正常接收消息。
//绑定失败的原因有多种,如网络原因,或access token过期。
//请不要在出错时进行简单的startWork调用,这有可能导致死循环。
//可以通过限制重试次数,或者在其他时机重新调用来解决。
final int errorCode = intent
.getIntExtra(PushConstants.EXTRA_ERROR_CODE,
PushConstants.ERROR_SUCCESS);
//返回内容
final String content = new String(
intent.getByteArrayExtra(PushConstants.EXTRA_CONTENT));
//用户在此自定义处理消息,以下代码为demo界面展示用
Log.d(TAG, "onMessage: method : " + method);
Log.d(TAG, "onMessage: result : " + errorCode);
Log.d(TAG, "onMessage: content : " + content);
通过在入口Activity的onCreate方法中进行推送服务的注册绑定后,即可在推送管理后台或是自己的应用服务器上进行消息推送的操作了。
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY, "you_api_key");
另外,云推送提供php、java等Server端的SDK供开发者在自己的服务器上实现推送服务进行定制化管理和操作。
四、单服务单通道机制
百度云推送实现了单服务单通道的机制,如果在一台Device上安装了多款Push SDK的应用,不会为每个应用都创建PushService,而是会采用多应用共享一个PushService的模式。这样既能减少资源消耗也能降低网络流量。PushService运行于一个独立进程,没有和主进程运行于同一进程,所以主进程不需要常驻内存,当有新的Push消息时,PushService会通过Intent发送消息给主进程进行处理。通过Intent,以指定目标应用包名的方式,发送私有消息给应用。应用即不能接收不属于自己的消息,也不能截取别人的消息,同时又降低了消耗,如下为示意图:
后记:如今,国内提供Android推送服务的还有很多家,例如个推和极光推送等,实现的原理大同小异,开发者可以根据自身需要进行选择。身在天朝,置身墙内,用不到GCM,就创造Android Push Service for China自给,或者,出走!}

我要回帖

更多关于 神探夏洛克可恶的新娘 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信