推送,顾名思义,是由一方发起,另一方通过某种办法与发起方建立连接并吸收。 在Android开拓中,这里的发起者称为Push Server,吸收者称为Client。 与轮询获取新或关照比较,推送在客户端资源花费和设备功耗方面都优于轮询。 因此,目前须要及时推送的运用大多采取Push。 关照的方法。
Android生态系统最初供应了类似于Apple iOS推送做事APNS的GCM(Google Cloud Messaging for Android),以前称为C2DM。 但由于某些缘故原由,这项做事在中国不太好用。 为了填补这个缺陷,而且同胞们又想重新利用Android推送做事,以是海内各大平台都陆续推出了GCM的替代品。 本日我要先容的便是个中之一,百度供应的云推送。 此外,海内新闻推送做事有极光推送、个人推送等,其客户包括新浪微博、淘宝等海内大型企业。
Push的实现技能大略来说便是利用Socket来坚持Client和Server之间的TCP长连接。 这样,可以大大减少轮询办法造成的Device的功耗和数据访问流量。 目前,百度云推送供应的推送做事支持单条体大小为4k。 如果超过4k,建议第二次要求时在中携带做事要求URL。 目前,百度云推送为Android供应关照推送、短信推送和富媒体推送。

二、利用场景 1、单播推送
Push Server 将推送到指定的设备(Device)或用户(User)。 一个用户对应一个userID。 一个用户可能有多个设备。 我们希望当向同一个userID推送时,他所有与该userID绑定的Device都可以收到该。 百度云推送供应的办理方案是通过Client向Push Server注册,并在Client的监听端口获取Push Server返回的channelID和userID。 ChannelID指定终端。 在向推送做事器注册过程中,设备可以发送 IMIE 代码。 或者利用UUID作为唯一标识,注册后将Client天生的channelID和userID返回给Push Server。 这两个ID得到后,由开拓者自己掩护。 注册完成后,Push Server 会掩护一个已注册设备的列表。 该列表掩护了userID和channelID以及与Device的对应关系。 当须要向指定设备或用户推送时,Push Server会首先遍历设备列表,利用这两个ID进行唯一判断,找到须要推送的Device,然后即可推送。
示例:当用户A发布问题时,会记录问题id及其对应的userID(或channelID)。 当用户B发布问题答案时,答案会通过做事器API推送到问题id对应的userID(或channelID)所指向的Device上。
2.群组推送
百度云推送通过在客户端设置标签对用户进行分组。 标签可以由客户端天生,也可以由做事器网络。 Push Server对不同的Tags进行推送过滤,终极将推送到指定的Client。 无论是客户端主动设置的Tags,还是做事器根据用户利用习气网络的Tags,都由Push Server统一管理。 在实现基于Tags的群组推送时,Push Server首先根据指定的Tag从所有Tags中遍历对应的标签。 注册Device,这样就可以获取到Device对应的userID和channelID,然后可以针对指定Tag推送群组。 与单播推送比较,群组推送的推送周期一定较长,并且在掩护待推送的列表时也须要进行一些处理。 哪些推送成功,哪些推送失落败,须要吸收推送。 Client收到后会给Push Server一个回执,从而担保通报的准确性。 如果推送失落败,则连续推送群组列表中的待推送,直至推送成功。 其余,就推送的实时性而言,与单播推送比较,根据组行列步队的顺序,吸收会存在延迟。 例如,目前微信"大众号的推送便是群推送的一个例子。 吸收的及时性比较单播推送存在一定的延迟。
除此之外,还有一类推送的利用场景,那便是广播。 这种类型可以理解为一种分外的分组列,即将推送到Tags对应的所有Client上。 广播是向全体凑集推送的。 行列步队掩护和推送时效性的本钱高于单个或多个标签的组推送。
示例:为运用程序供应首选项设置页面。 用户查看不同的种别会触发相应Tag的设置。 这样,Client就主动掩护了Tag。 或者用户阅读了某个类别的书本,触发了对应标签的设置。 在做事器端,为指定类别的图书设置标签。 随后,该标签下的新书信息会根据做事器采集到的标签推送到运用程序。 这种方法是Tag组由做事器掩护。
3、百度云推送Android_SDK
百度供应了完全的demo,帮助开拓者集成云推送做事。 推送做事SDK可以通过.jar包和.so文件集成到我们自己的项目中。 在此之前,您须要前往百度开拓者中央注册您的运用并获取API Key。 这是利用推送做事运用程序的唯一指标。 详细过程我就不多说了。 如果须要利用,可以直接访问百度开拓者中央查看。
下面紧张看一下Android_SDK的整体概述和内部运行机制:
上图是百度云推送Android_SDK的框架图。 通过SDK,您可以绕过繁芜的Push HTTP/HTTPS API,直接与Push做事器交互。 紧张供应以下功能:
Android端一共实现了3个Receiver和1个Service。 个中,1个Receiver用于处理注册绑定后做事器返回的channelID等信息:
12345678910
第二个Receiver用于吸收系统,担保PushService的正常运行:
12345678
第三个Receiver是开拓者自己实现的,用于吸收并处理推送:
1234567
Service是后台做事,运行在后台,与Push Server保持长连接并进行干系处理:
12
在开拓者须要处理的广播吸收器中,可以对吸收到的推送进行处理。 Push通过Intent将数据发送到客户端your.package,action为com.baidu.android.pushservice.action.MESSAGE。 PushMessageReceiver,格式由运用程序自己决定,PushService只卖力将做事器发送的以字符串格式透传给客户端。 接口调用回调通过action为com.baidu.android.pushservice.action.RECEIVE的Intent返回到your.package.PushMessageReceiver。
PushMessageReceiver.java
123456789101112131415161718192021222324252627282930313233343536373839404142434445
/ Push处理receiver @Author Ryan @Create 2013-8-6 下午5:59:38 /public class PushMessageReceiver extends BroadcastReceiver { public static final String TAG = PushMessageReceiver.class.getSimpleName(); @Override 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方法中注册并绑定推送做事后,就可以在推送管理后台或者自己的运用做事器中进行推送操作。
1
PushManager.startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY, "you_api_key");
此外,云推清偿供应PHP、Java等做事器端SDK,供开拓者在自己的做事器上实现推送做事,进行定制化的管理和操作。
4、单做事单渠道机制
百度云推送实现了单做事、单渠道的机制。 如果一个Device上安装了多个Push SDK运用,则不会为每个运用创建一个PushService。 相反,多个运用程序将共享一个 PushService。 这不仅可以减少资源花费,还可以减少网络流量。 PushService运行在独立的进程中,不与主进程运行在同一个进程中,因此主进程不须要驻留在内存中。 当有新的Push时,PushService会通过Intent将发送到主进程进行处理。 通过Intent,通过指定目标运用程序包名向运用程序发送私有。 运用程序不能吸收不属于自己的,也不能拦截来自他人的。 同时,它减少了花费。 下面是示意图:
后记:如今,海内的Android推送做事有很多,比如个人推送、极光推送等。 实现事理类似,开拓者可以根据自己的需求进行选择。 如果中国不须要GCM,就为中国创建Android Push Service自给自足,或者跑掉!