小米Push

本文介绍了小米Push的集成过程,包括基于RegID的推送、通知过滤、MIUI 10的通知栏重构以及如何自定义BroadcastReceiver接收消息。集成小米Push需要在build.gradle中添加依赖,并实现PushMessageReceiver类。应用获取到RegID后应将其上传到服务器以便发送消息。文章还提及了消息到达客户端后的回调处理以及如何控制通知栏消息的显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 小米推送介绍(着急集成移步第二节)

1. 小米推送类型?

支持通知栏提醒(不需要应用驻留后台)和透传消息两种类型,同时提供运营平台API两种推送消息下发方式

2. 小米推送样式?

MIUI10(目前最新版本MIUI12.5)以上,同一个App的所有通知栏消息会聚合成一个消息组,消息组最多支持展示10条消息,超过10条消息,会自动删除一条最老的消息并补上来一条新消息

3. 小米推送实现方式?

小米推送支持标签(Topic)、RegID、别名(Alias)、Useraccount四种消息发送方式

目前APP常用的推送是RegID推送

4. 基于 RegID的推送

RegID是小米推送为每个设备上的每个app注册推送服务时生成的唯一标识

RegID是在客户端向小米推送服务注册时,小米推送服务端根据设备标识、AppID以及当前时间戳生成,因此能够保证每个设备上每个app对应的regID都是不同的

PS: RegID在应用卸载或清除本地数据后会重新生成

5. 自MIUI 9开始,新增了通知过滤的功能

通知过滤是指通过分析用户对通知的操作,来个性化地确定通知的重要与不重要,然后将不重要的通知收纳进一个统一的页面。

6. MIUI 10

MIUI 10 通知栏基于 Android O 做了重构,大大增强了通知栏的能力

通知类别 (Channel) 适配说明

通知类别 (channel) 是 Android O 引入的新功能,旨在解决以下问题:

  1. 应用的通知越来越多,给用户造成明显打扰
  2. 但用户只能全局屏蔽这个应用的全部通知,不能屏蔽部分,然后留下对自己有用的

7. 通知样式

注: 在MIUI中,由于通知栏是由小米服务框架弹出,因此大、小图标均不可自定义。使用的声音资源必须先内置在应用程序的安装包中。


2. 集成小米Push

题外话: 小米推送客户端SDK集成很简单,仅需一位工程师0.5天的时间即可完成,不知真假:)

了解步骤之前先下载第3点的SDK,我这边是选择AAR方式集成

1. 项目app module的 build.gradle 中添加依赖

android{
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}
dependencies {
    implementation (name: 'MiPush_SDK_Client_xxx', ext: 'aar')
}

2. 为了接收消息,您需要为APP自定义一个继承自 PushMessageReceiver 类的BroadcastReceiver

<!-- Mi Push  -->
        
<!-- com.example.mi.MiMessageReceiver 中 com.example 替换为自己APP的包名  -->
<receiver
 android:name="com.example.mi.MiMessageReceiver"
 android:exported="true">
 <intent-filter>
   <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
 </intent-filter>

 <intent-filter>
   <action android:name="com.xiaomi.mipush.ERROR" />
 </intent-filter>
</receiver>

<!-- Mi Push -->

注意:请务必确保该自定义BroadcastReceiver所在进程与调用注册推送接口(MiPushClient.registerPush())的进程为同一进程(强烈建议都在主进程中)

后续需要推送消息的注册ID(regId)等都会在这个Recevier中回调

3. 应用调用MiPushClient类的静态方法registerPush注册小米推送服务

     /**
     * 2. 小米
     * <p>
     * 注册 Mi Push 服务,注册成功后会向 MiMessageReceiver 发送广播
     * 可以从 MiMessageReceiver 的  onCommandResult 方法中 MiPushCommandMessage 对象参数中获取注册信息
     *
     * @param mResult
     */
    public void initMiService(MethodChannel.Result mResult) {
        if (shouldInit()) {
            MiPushClient.registerPush(this, MI_APP_ID, MI_APP_KEY);
        }
        LoggerInterface newLogger = new LoggerInterface() {


            @Override
            public void setTag(String tag) {
                // ignore
            }

            @Override
            public void log(String content, Throwable t) {
                CLog.i(TAG, content);
            }

            @Override
            public void log(String content) {
                CLog.i(TAG, content);
            }
        };
        Logger.setLogger(this, newLogger);
    }

4. 注册结果将通过PushMessageReceiver继承类的onCommandResult方法中的MiPushCommandMessage参数对象message传到客户端。当message对象的command等于MiPushClient.COMMAND_REGISTER,并且message对象的resultCode等于ErrorCode.SUCCESS时,message对象commandArguments包含了服务器返回的regIdregId即是当前设备app的唯一标示。您可以将regId上传到自己的服务器,方便向其发消息。

在啰嗦一句,regId是由服务器端生成的,能够唯一标识某台手机上的某个应用。 应用在获取到regId后,需要将regId上报到应用的服务器,此时应用服务端就可以利用regId向客户端发送消息

5. 消息到达客户端后会弹出通知,点击通知消息,会回调 onReceiveMessage

	/**
     * 新版实现的接口访方法有更新;
     *
     * @param context
     * @param message
     */
    @Override
    public void onReceiveMessage(Context context, MiPushMessage message) {
        if (message.getPassThrough() == 0) {
            Log.i(TAG, "message.getContent(): " + message.getContent());
            Log.i(TAG, "message " + message.toString());
            if (!TextUtils.isEmpty(message.getContent())
                    && message.isNotified()) {
                try {
                    JSONObject openCallback = new JSONObject(
                            message.getContent());
                    Log.i(TAG, "openCallback: " + openCallback.toString());
                    // 启动对应APP...... 这里如果不写逻辑的话,点击通知栏的消息,启动不了APP的,切记
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

6. 小提示

1. 对开发者而言,使用客户端SDK可以完成两方面功能:

  • 客户端给服务器发送各种请求(对应MiPushClient的接入类)。
  • 服务器给客户端发送的消息和对客户端请求的响应(对应PushMesssageReceiver的实现类)。

2. 当成功集成小米推送过后,服务端构建消息时,可以通过设置EXTRA_PARAM_NOTIFY_FOREGROUND的值设置为"0"或者"1",来确定是否应用处于前台时弹出通知栏消息;


3. 参考

1. SDK下载

2. Android版快速接入指南

3. Android客户端SDK集成指南(JAR版)

4. Android客户端SDK集成指南(AAR版) (推荐方式)

5. 服务端Java SDK文档(速度发给你们的服务端小伙伴)

6. 推送SDK版本更新

7. 媒体通知是Android标准通知样式的一种,自 API 21(Android 5.0) 引入,方便用户直接控制媒体内容,常见于音乐类、广播类应用。
8. 应用角标

9. 推送服务启用指南

10. 小米推送消息限制说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初心一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值