前:本文为QiaoJim原创,转载请附原文链接,谢谢合作!
http://blog.csdn.net/qiao_jim/article/details/77742936
----------------------------------------------------------------------------------
上一篇博客android小米,华为,百度Push封装(准备阶段)
介绍了如何快速复制粘贴,查找替换,将小米,华为,百度 push 服务接入到app项目中。
这篇博文就在准备阶段的基础上,使用封装的 QJPushService 来达到真正实现消息推送的功能。
jar包下载地址 QJPushManager_1.1.jar(在我github项目的 /app 目录下)
这篇博文主要介绍使用封装后的 QJPushService,来简化消息推送的实现过程,个人感觉官方给的有些功能在一般的项目里,不是很常用。
所以就将3家的push简单封装了一下。按照以下步骤,可以控制:推送消息到达的逻辑,通知栏点击的逻辑,推送服务错误的逻辑。
如果大家项目需求还需要在其他时期自定义逻辑,详细使用请参考 push 官方提供的文档。
一、开始使用
1、一个 QJPushListener.QJHuaweiListener 的实现类,建议为项目的 BaseActivity,接口实现直接复制下方给出的代码
@Override public void onUpdateFailed(@NonNull ConnectionResult connectionResult) { Log.w("QJHuaweiListener", "onUpdateFailed, " + connectionResult.getErrorCode() + ""); } @Override public void onConnected() { Log.i("QJHuaweiListener", "onConnected, IsConnected: " + QJPushManager.getHuaweiClient().isConnected()); // 已连接,获取华为push唯一标识token if (QJPushManager.getHuaweiClient().isConnected()) { QJPushManager.getHuaweiToken(); } } @Override public void onConnectionSuspended(int i) { Log.i("QJHuaweiListener", "onConnectionSuspended, cause: " + i + ", IsConnected: " + QJPushManager.getHuaweiClient().isConnected()); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { Log.w("QJHuaweiListener", "onConnectionFailed, " + connectionResult.getErrorCode() + ""); // 如果连接错误,判断是否可处理 final int errorCode = connectionResult.getErrorCode(); final HuaweiApiAvailability availability = HuaweiApiAvailability.getInstance(); if (availability.isUserResolvableError(errorCode)) { // 用户端解决错误 availability.resolveError(this, errorCode, QJConstant.REQUEST_RESOLVE_HUAWEI_ERROR, impl); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == QJConstant.REQUEST_RESOLVE_HUAWEI_ERROR) { final int errorCode = HuaweiApiAvailability.getInstance().isHuaweiMobileServicesAvailable(this); // 错误处理成功 if (errorCode == ConnectionResult.SUCCESS) { // 获取华为client,并尝试连接 HuaweiApiClient client = QJPushManager.getHuaweiClient(); if (!client.isConnecting() && !client.isConnected()) { client.connect(); } } else { // TODO: 处理errorCode } } }
2、new HuaweiListenerImpl(),然后调用其实例的 setQJListeneer(),传入 1 中的接口实现类
impl = new HuaweiListenerImpl(); // 设置 QJPushListener.QJHuaweiListener 实现 impl.setQJListener(BaseActivity.this);
3、设置申请3家服务的信息,传入的值详见注释即可,最后调用 QJPushManager.startPushService()即完成消息推送的功能
说明:开启服务后,app端已经能通过3家 push 提供的控制台进行消息推送了。如果需要进一步,获取推送拿到的标题,正文,附加值,
请接着往下看,只需再实现3个接口即可。
/* * context - 建议传入getApplicationContext() * flag - true为自动设置手机 IMEI 号为用户标签 */ QJPushManager.prepare(getApplicationContext(), true); /* * appId - 申请的小米push的 app id * appKey - 申请的小米push的 app key */ QJPushManager.prepareMi("2882303761517585298", "5531758546298"); /* * appKey - 申请的百度push的 api key */ QJPushManager.prepareBaidu("dtHgWqOiGR1EqoWHF7rlSCwy"); /* * listener - HuaweiListenerImpl 实例 */ QJPushManager.prepareHuawei(impl); // 开启推送 QJPushManager.startPushService();
4、开启推送时,注册 QJPushReceiver,建议在 BaseActivity 的 onCreate()方法中
再实现 QJPushListener 接口即可控制以下逻辑:(1)推送消息到达;(2) 通知栏点击;(3)错误处理
说明:
(1)QJMessage 有3个字段,title为推送的标题,body为消息正文,extra为附加值,通过get方法获取即可
(2)在 onDestroy()中调用 QJBroadcastUtil.unregQJReceiver(context , receiver) 注销QJPushReceiver
receiver = new QJPushReceiver(); /* * 分别传入 Context, QJPushReceiver的实例, QJPushListener的实现类 */ QJBroadcastUtil.regQJReceiver(this, receiver, this); @Override public void onMsgArrived(QJMessage msg) { Toast.makeText(this, msg.getBody(), Toast.LENGTH_SHORT).show(); } @Override public void onNotificationClicked(QJMessage msg) { Toast.makeText(this, msg.getBody(), Toast.LENGTH_SHORT).show(); } @Override public void onError() { Toast.makeText(this, "出现错误", Toast.LENGTH_SHORT).show(); }
5、其他说明
(1)如果开发者使用手机 IMEI 作为推送标识符,6.0以上需要运行时授权READ_PHONE_STATE
(2)QJPushManager.stopPushService()可停止服务,一般不需使用
(3)QJPushManager.getRomType()可获取手机类型,返回String为“Xiaomi”,“Huawei”,“Other”之一
(4)QJPushManager.getIMEI()可获取手机IMEI号
6、小米push自定义部分,以下均为QJPushManager的静态方法:
void setMiTag(String tag) void setMiAlias(String alias) void setMiAccount(String account) void deleteMiTag(String tag) void deleteMiAlias(String alias) void deleteMiAccount(String account)
7、百度push自定义部分,以下均为QJPushManager的静态方法:
void setBaiduTag(List<String> tag) void deleteBaiduTag(List<String> tag) void listBaiduTag()
8、华为push相关,以下均为QJPushManager的静态方法:
HuaweiApiClient getHuaweiClient() void getHuaweiToken()