App开发中,服务器主动向客户端推送消息,基本采用第三方推送服务。本文讲述在组件化项目开发中,如何集成推送服务并进行业务隔离,集成多通道推送提高到达率、消息去重等。
系列文章
Android组件化-基础框架搭建
Android组件化-组件间通信BRouter
Android组件化-风格统一&主题变色
Android组件化-MVP设计模式
首先集成极光推送 ,具体操作参考极光推送Android SDK集成指南 。我们要做到推送服务与业务代码隔离,在lib-push库中处理推送逻辑,对外暴露一个推送服务初始化接口,以及推送通知接口,具体实现如下。
推送初始化 新建PushClient类,使用单例模式,这是对外提供服务的工具类,包含推送初始化、别名设置、通知接口设置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public class PushClient { PushListener mListener; public static PushClient getInstance () { ... return instance; } public PushClient init (Context context) { this .mContext = context; JPushInterface.setDebugMode(true ); JPushInterface.init(mContext); ... return PushClient.this ; } public PushClient setAlias (String alias) { JPushInterface.setAlias(mContext, new Random ().nextInt(), alias); ... return PushClient.this ; } public PushClient setListener (PushListener listener) { this .mListener = listener; return PushClient.this ; } }
推送回调 PushListener为回调接口,业务层实现此接口,当推送服务收到推送,会在接收器里回调此实现,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Override public void onReceive (Context context, Intent intent) { try { Bundle bundle = intent.getExtras(); Log.d(TAG, "[JPush]: onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle)); ... if (PushClient.getInstance().mListener != null ) { PushClient.getInstance().mListener.onPush(context, content); } ... } catch (Exception e) { } }
当业务层接收到推送后,可进行具体而复杂的处理。
多通道推送 实际开发中,遇到小米推送不及时、偶发性推送失效的场景,解决方案是集成2-3个推送通道,本项目集成了小米、极光推送,小米推送集成参见小米推送Android客户端SDK使用指南 ,和极光推送一样,都配置在lib-push中,与上层逻辑隔离,集成时请留意权限配置。小米推送依然在PushClinet中初始化,别名设置也在setAlias()方法中。
此时迎来第二个问题,多通道推送必然导致消息重复,需要对收到的推送进行过滤,也正式因此,消息推送最好采用自定义消息(小米称透传消息)的方式推送,方便客户端进行消息过滤以及自定义通知栏。
消息去重 在消息到达客户端的时候,不再直接回调业务层接口实现,应该先进行消息处理,确认消息不重复之后再进行回调通知,加入PushManage消息处理类,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public void onReceive (Context context, Intent intent) { try { Bundle bundle = intent.getExtras(); Log.d(TAG, "[JPush]: onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle)); ... PushManage.push(context, content); ... } catch (Exception e) { } }
PushManage对消息进行过滤,并存储到数据库,重启App以后仍然可对消息进行有效过滤,防止推送延迟严重的现象。
项目Github地址:https://github.com/blackist/modulize