10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

博文共赏:Android 推送服务——百度云推送

  • 2013-09-25
  • 本文字数:4225 字

    阅读完需:约 14 分钟

一、推送服务简介

消息推送,顾名思义,是由一方主动发起,而另一方与发起方以某一种方式建立连接并接收消息。在 Android 开发中,这里的发起方我们把它叫做推送服务器(Push Server),接收方叫做客户端(Client)。相比通过轮询来获取新消息或通知,推送无论是在对客户端的资源消耗还是设备耗电量来说都比轮询要好,所以,目前绝大多数需要及时消息推送的 App 都采用 Push 的方式来进行消息通知。

Android 生态系统原本提供了类似于 Apple iOS 推送服务APNSGCM(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 返回的 channelIDuserIDchannelID指定一个终端,在向 Push Server 注册的过程中,Device 可以发送 IMIE 码或者 UUID 作为唯一标示,在 Push Server 注册后再返回给 Client 生成的channelIDuserID。这两个 ID 获取到后由开发者自行维护,注册完毕后,Push Server 维护一个注册设备列表,这个列表维护了userIDchannelID以及与 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 对应的userIDchannelID,继而可以针对指定 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 android:name="com.baidu.android.pushservice.RegistrationReceiver" android:process=": bdservice_v1"> <intent-filter> <action android:name="com.baidu.android.pushservice.action.METHOD " /> <action android:name="com.baidu.android.pushservice.action.BIND_SYNC " /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package" /> </intent-filter> </receiver>第二个 Receiver 是用于接收系统消息以保证 PushService 正常运行:

<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver" android:process=": bdservice_v1"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="com.baidu.android.pushservice.action.notification.SHOW" /> <action android:name="com.baidu.android.pushservice.action.media.CLICK" /> </intent-filter> </receiver>第三个 Receiver 就是开发者自己实现的用来接收并处理推送消息:

<receiver android:name="your.package.PushMessageReceiver"> <intent-filter> <!-- 接收 push 消息 --> <action android:name="com.baidu.android.pushservice.action.MESSAGE" /> <!-- 接收 bind、setTags 等 method 的返回结果 --> <action android:name="com.baidu.android.pushservice.action.RECEIVE" /> </intent-filter> </receiver>一个 Service 就是在后台运行的用于保障与 Push Server 维持长连接并做相关处理的后台服务:

<service android:name="com.baidu.android.pushservice.PushService" android:exported="true" android:process=" bdservice_v1"/> <!-- push service end -->在开发者自己需要处理的广播接收器中,可以对接收到的推送消息进行处理,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 * @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 方法中进行推送服务的注册绑定后,即可在推送管理后台或是自己的应用服务器上进行消息推送的操作了。

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 推送服务的还有很多家,例如个推和极光推送等,实现的原理大同小异,开发者可以根据自身需要进行选择。

原文地址: http://ryantang.me/blog/2013/08/06/baidu-push-service/

版权声明:保持署名 - 非商用 - 禁止演绎 | Creative Commons BY-NC-ND 3.0

关注 IT 趋势,承载前沿、深入、有温度的内容。感兴趣的读者可以搜索 ID:laocuixiabian,或者扫描下方二维码加关注。

2013-09-25 11:2434892

评论

发布
暂无评论
发现更多内容

得物新商品审核链路建设分享

得物技术

AI

RAGFlow+TextIn:RAG 实战教程!1 分钟实现解析性能提升

合合技术团队

人工智能 大数据 算法

EMNLP 2025|vivo 等提出 DiMo-GUI:模态分治+动态聚焦,GUI 智能体推理时扩展的新范式

vivo互联网技术

人工智能 推理模型 多模态大语言模型 GUI Agent Test-time Scaling

获高瓴光速数千万美元投资,质变科技发布首款类人决策智能体Bloom

AI数据云Relyt

数据智能 智能体 AI Agent 决策智能 Agentic AI

DeepSeek-V3.1上线百度智能云千帆,业内首发支持思考模式下Function Calling能力

科技热闻

国内好用的API网关推荐:技术选型与企业实践指南

RestCloud

API 数据安全 API网关 集成平台 ipaas

真正的产品迭代,源于更好的理解用户需求

Feedalyze

产品运营 产品迭代 用户反馈 用户需求 企业发展

5 个最佳 ServiceNow 开源替代品(含价格对比)

NocoBase

开源 低代码 零代码 ITSM ServiceNow

元图CAD:破解离散文字提取难题,释放工程设计效率新潜能

元图CAD

OCR 元图cad 提取文字 离散文字

中国通信工业协会城乡建设数字化专业委员会一行到访融云

融云 RongCloud

新华三 Polaris X20000 登顶 MLPerf Storage v2.0,ScaleFlux 助力实现高性能表现

ScaleFlux

震坤行商品列表API秘籍!轻松获取商品列表数据

tbapi

震坤行API 震坤行商品详情API 震坤行商品数据采集

超简单!手把手教你玩转ClaudeCode,无魔法不会员!

王磊

好用的思维导图网页版有哪些?这8个导图软件榜上有名!

职场工具箱

AI 思维导图 办公软件 思维导图软件 AI生成思维导图

腾讯内部测试管理工具揭秘:让用例"活"起来

优测云服务平台

测试管理工具

文心快码Zulu:项目级智能脚手架轰然降临

Comate编码助手

AI辅助编程 AI 编程 文心快码 文心快码Zulu

京东工业商品详情API秘籍!轻松获取商品详情数据

tbapi

京东工业数据采集 京东工业商品详情API 京东工业API

性能瓶颈定位更快更准:ARMS 持续剖析能力升级解析

阿里巴巴云原生

阿里云 云原生 Arms

抖音家政小程序融合版:助力家政服务高效接入多平台

微擎应用市场

小程序 抖音

解析 vLLM 架构及源码系列:模型执行过程

Jason黄

vLLM源码

ETL与iPaaS的融合方案:加速数据集成流程

RestCloud

数据处理 API ETL 数据集成平台 ipaas

你在用的内网穿透服务随时可能被关停?唯一方案在这里!

科技热闻

融云十周年程序员纪录片《十字路口》:三十而立,35+ 而已

融云 RongCloud

荣耀远航计划丨2025上半年激励成果一览

荣耀开发者服务平台

荣耀开发者服务平台 荣耀HONOR 荣耀远航计划

AI赋能驱动下的容器化应用开发范式升级

xuyinyin

IT故障响应慢?ManageEngine卓豪助您3步实现问题管理!

ServiceDesk_Plus

ManageEngine卓豪

实时平台Flink热更新技术——实现不停机升级!

袋鼠云数栈

flink sql

蓝队网络流量分析脚本:自动化威胁检测与防御利器

qife122

网络安全 流量分析

阿里云 Milvus 节省计划来袭:4 折抵扣按量账单,59 元起玩转向量检索!

阿里云大数据AI技术

ETL中的数据质量评估与监控

RestCloud

数据库 数据处理 数据安全 ETL ETL数据集成平台

一个平台让开发效率提升90%?看看中小企业如何靠iPaaS完成数字化转型

RestCloud

数据处理 集成平台 ipaas

博文共赏:Android推送服务——百度云推送_Android/iOS_唐韧_InfoQ精选文章