android 小米,华为,百度推送封装(QJPushService 使用)

长孙哲
2023-12-01

前:本文为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()



 类似资料: