前:本文为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);
说明:开启服务后,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()