小米超级岛推送指南

更新时间:
复制 MD 格式

说明

小米超级岛功能当前处于公测阶段,如您在接入过程中遇到任何问题,请及时通过工单或技术支持渠道反馈,我们将跟进处理。建议您先在测试环境中充分验证后再用于生产环境。

准备工作

在开始使用小米超级岛功能之前,您需要完成以下准备工作:

  1. 已参考Android SDK接入小米厂商通道集成完成SDK和小米厂商通道的接入。

  2. 已参考开通小米超级岛服务在小米开发者平台开通小米超级岛服务。

  3. 已参考常见Q&A中的说明申请发送邮件焦点通知权限。

  4. 已参考channel申请及接入方法在小米推送运营平台申请用于推送超级岛的channel_id。

  5. 已参考小米超级岛开发指南和模板库完成展示模板设计,并准备好模板中引用的图片资源。

核心概念

小米超级岛是一个持续服务与重要信息展示空间,帮助用户快速掌握服务进展并及时处理。其技术架构&产品方案是在焦点通知基础上的能力升级。

产品形态

小米超级岛可在摘要态和展开态之间切换,支持大岛、小岛、锁屏、通知栏、息屏等展示位置。用户可以通过点击、滑动、下拉小窗和拖拽分享等方式查看或处理持续服务信息。

版本支持

  • Xiaomi HyperOS 2支持焦点通知,展示位置包括状态栏、通知中心、锁屏、息屏和小折叠外屏。

  • Xiaomi HyperOS 3支持小米超级岛通知,包含岛摘要态、岛展开态以及焦点通知除状态栏外的各个位置。

小米超级岛与焦点通知的数据接口相同,您可以通过模板选择或按系统版本下发不同数据来兼容不同系统版本,Xiaomi HyperOS 系统版本判断方式参考《开发指南》

展示示意

焦点通知示意图如下:

小米焦点通知示意图

超级岛示意图如下:

小米超级岛示意图

适用场景

超级岛适用于有明确开始和结束、生命周期有限且用户高度关注的持续性服务,例如打车、取餐、配送、排队、充电、导航等。营销、广告、长期常驻、无明确进度的纯告知类内容不适合接入超级岛。

客户端配置App Id 和构建版本 Debug 标识

在应用的 AndroidManifest.xml 中添加 meta-data 配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
       
        <meta-data
            android:name="com.xiaomi.xms.APP_ID"
            android:value="your app id here" />
            
        <meta-data
            android:name="com.xiaomi.xms.BUILD_TYPE_DEBUG"
            android:value="true or false" />
   
    </application>
</manifest>

详细说明请参考接入联调测试

客户端本地创建/更新/清除超级岛

应用进程活跃时,可以按照发送Android原生通知的方式创建超级岛通知,在通知的extras中写入miui.focus.param,并通过miui.focus.pic_*传递图片资源,通过miui.focus.action_*设置点击动作。具体字段和模板请参考小米开发指南

// 获取NotificationManager对象
Context context = getApplicationContext();
String channelId = "test_channel";
int notificationId = 1;
NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);

// 创建通知通道,若已有通知通道可直接复用,无需重复创建
NotificationChannel channel = new NotificationChannel(channelId, "test_channel_name", NotificationManager.IMPORTANCE_HIGH);
notificationManager.createNotificationChannel(channel);

// 构建岛通知参数
String islandParams = """
{ 
    // OS2/OS3
    "param_v2": {
        "protocol": 1,
        // 运营场景, 比如打车场景为 taxi
        "business":"taxi",
        "enableFloat": true,
        "updatable": true,
        // 状态栏数据
        "ticker": "ticker",
        "tickerPic": "miui.focus.pic_ticker",
        // 息屏 AOD 数据
        "aodTitle": "aodTitle",
        "aodPic": "miui.focus.pic_aod",
        // 岛数据
        "param_island": {
            "islandProperty": 1,
            // 大岛数据
            "bigIslandArea": {
                // 大岛 A 区
                "imageTextInfoLeft": {
                    "type": 1,
                    "picInfo": {
                        "type": 1,
                        "pic": "miui.focus.pic_imageText"
                    },
                    "miui.focus.paramtextInfo": {
                        "frontTitle": "充电中",
                        "title": "24%",
                        "content": "剩5分钟",
                        "useHighLight": false
                    }
                },
                // 大岛 B 区
                "picInfo": {
                    "type": 1,
                    "pic": "miui.focus.pic_imageText"
                }
            },
            // 小岛
            "smallIslandArea": {
                "picInfo": {
                    "type": 1,
                    "pic": "miui.focus.pic_imageText"
                }
            },
            // 分享数据
            "shareData": {
                "title": "share_title"
            }
        },
        // 焦点通知数据
        "baseInfo": {
            "title": "待取件",
            "content": "安宁华庭2区8号底商店菜鸟驿站",
            "colorTitle": "#006EFF",
            "type": 2
        },
        "hintInfo": {
            "type": 1,
            "title": "2件包裹",
            "actionInfo": {
                "action": "miui.focus.action_test"
            }
        },
        "extraInfo": {
            "carType": "YU7",
            "carColor": "白色"
        }
    }
}
""";

// 创建通知
Notification notification = new Notification.Builder(context, channelId)
    .setContentTitle(testTitle)
    .setContentText(testText)
    .setSmallIcon(smallIconResId)
    .build();

Bundle bundle = new Bundle();
// 添加 Action 数据
Bundle actions = new Bundle();
Intent intent = new Intent(ACTION_FOCUS_NOTIFICATION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent2, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)
Notification.Action action = new Notification.Action
        .Builder(Icon.createWithResource(this, R.drawable.xxxx), "xxx", pendingIntent)
        .build();
actions.putParcelable("miui.focus.action_test", action);

bundle.putBundle("miui.focus.actions", actions);

// 添加图片数据
Bundle pics = new Bundle();
pics.putParcelable("miui.focus.pic_imageText", Icon.createWithResource(this, R.drawable.xxx));
pics.putParcelable("miui.focus.pic_highlight", Icon.createWithResource(this, R.drawable.xxx));
bundle.putBundle("miui.focus.pics", pics);

builder.addExtras(bundle);
Notification notification = builder.build();
// 添加岛参数    
notification.extras.putString("miui.focus.param", islandParams);
// 发送通知
notificationManager.notify(notificationId, notification);

清除客户端本地创建的超级岛时,调用Android原生notificationManager.cancel(notificationId)即可。

通过移动推送接口远程创建/更新/结束超级岛

移动推送支持通过Push接口或MassPush接口远程创建/更新/结束小米超级岛通知。

参数设置

调用接口时注意以下关键参数:

  • PushType(必填):推送超级岛时固定设置为NOTICE

  • AndroidNotificationNotifyId(必填):通知唯一标识。同一条超级岛通知的创建、更新和结束需要使用相同的NotifyId。

  • AndroidNotificationXiaomiChannel(必填):小米推送运营平台申请的channel_id

  • AndroidPopupActivity、AndroidPopupTitle、AndroidPopupBody(必填):用于普通通知兜底展示和点击跳转。其中AndroidPopupActivity需要参考辅助弹窗接入完成接入。

  • AndroidXiaomiFocusParam(必填):小米超级岛参数,JSON字符串,对应小米miui.focus.param,结束超级岛时需要将cancel设为true。该参数最大不超过3072字节。

  • AndroidXiaomiFocusPics(可选):小米超级岛图片参数,JSON字符串,keymiui.focus.pic_*,valueHTTPS图片URL。该参数最大不超过1024字节,如果填写此参数,必须同时填写AndroidXiaomiFocusParam。

AndroidXiaomiFocusParam整体为JSON字符串,根节点通常为param_v2。下表给出部分参数的说明,使用参数路径展示层级关系,其中param_v2为一级参数,param_v2.xxxparam_v2下的二级参数。其余的模板组件参数结构如baseInfohintInfo请参考⼩⽶超级岛通知模板库

参数路径

是否必选

参数类型

描述

param_v2

Object

小米焦点通知和超级岛参数根节点。创建、更新和结束超级岛时,业务字段均填写在该对象下。

param_v2.business

String

运营场景(数据统计)。

param_v2.islandFirstFloat

boolean

通知第一次出现时,是否自动显示展开态
- true:展开态
- false:摘要态
默认值:true

param_v2.enableFloat

boolean

通知更新时,是否自动展开为展开态
- true:展开
- false:不展开
默认值:false

param_v2.timeout

int

焦点通知的默认消失时间,
- 单位:min
- 默认值:720

param_v2.cancel

boolean

是否直接结束通知,值为 true 时,触发移除通知。

param_v2.updatable

boolean

是否允许后续更新同一条超级岛通知。需要远程更新的场景建议设置为true

- 默认:false

param_v2.reopen

String

相同 notification id 的通知被 cancel 后,再次发送是否显示, 前提:update = true
- reopen:再次显示
- close:不显示
- 默认:close

param_v2.filterWhenNoPermission

boolean

应用焦点通知权限被关闭时退化为普通通知的处理方式:
- false,通知正常显示不被过滤
- true,通知后被过滤,不显示
- 默认值:false

param_v2.orderId

String

订单号。

param_v2.sequence

long

本订单第几次更新通知,避免通知展示乱序。

param_v2.param_island

Object

岛相关数据,详细结构请参考岛属性数据

param_v2.extraInfo

Object

业务扩展信息,可按小米模板和自身业务场景透传。

param_v2.aodTitle

String

息屏焦点通知显示文案

param_v2.aodPic

String

息屏模式图标
不传默认为应用图标,
自定义图标需要和miui.focus.pics参数对应

param_v2.ticker

String

OS2 焦点通知状态栏显示文案

param_v2.tickerPic

String

OS2 焦点通知状态栏图标
不传默认为应用图标,
自定义图标需要和miui.focus.pics参数对应

param_v2.tickerPicDark

String

暗黑模式下图标

...

AndroidXiaomiFocusPics的示例结构如下:

{
    "miui.focus.pic_ticker": "https://example.com/ticker.jpg",
    "miui.focus.pic_aod": "https://example.com/aod.jpg",
    "miui.focus.pic_imageText": "https://example.com/imageText.jpg"
}

图片有以下要求:

  • 系统为通知下载图片所消耗的流量,会分发计算到对应应用上。

  • 通知单张图片的大小不得超过100k,超过100k则不下载,视为下载失败。

  • 图片下载全流程最大等待180s,超时则下载失败。

  • 通知图片链接必须是Https格式,否则按下载失败处理。

  • 图片宽高比在 1.78(16:9) - 1(1:1)之间。

  • 单个通知图片的数量不得大于10张,若超过10张,XMSF只会按顺序下载10张,其他不下载。

示例代码

远程创建超级岛

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);

// 设置远程创建超级岛的参数
pushRequest.setAndroidNotificationNotifyId(1);
pushRequest.setAndroidNotificationXiaomiChannel("130626");
pushRequest.setAndroidPopupTitle("待取件");
pushRequest.setAndroidPopupBody("安宁华庭2区8号底商店菜鸟驿站");
// 兜底通知点击跳转activty,需要接入辅助弹窗
pushRequest.setAndroidPopupActivity("xx.YourAndroidPopupActivity");

String createFocusParam = """
{
    "param_v2": {
        "protocol": 1,
        "business": "taxi",
        "enableFloat": true,
        "updatable": true,
        "orderId": "A580202509130712",
        "sequence": 1,
        "ticker": "ticker",
        "tickerPic": "miui.focus.pic_ticker",
        "aodTitle": "aodTitle",
        "aodPic": "miui.focus.pic_aod",
        "param_island": {
            "islandProperty": 1,
            "bigIslandArea": {
                "imageTextInfoLeft": {
                    "type": 1,
                    "picInfo": {
                        "type": 1,
                        "pic": "miui.focus.pic_imageText"
                    },
                    "miui.focus.paramtextInfo": {
                        "frontTitle": "充电中",
                        "title": "24%",
                        "content": "剩5分钟",
                        "useHighLight": false
                    }
                },
                "picInfo": {
                    "type": 1,
                    "pic": "miui.focus.pic_imageText"
                }
            },
            "smallIslandArea": {
                "picInfo": {
                    "type": 1,
                    "pic": "miui.focus.pic_imageText"
                }
            },
            "shareData": {
                "title": "share_title"
            }
        },
        "baseInfo": {
            "title": "待取件",
            "content": "安宁华庭2区8号底商店菜鸟驿站",
            "colorTitle": "#006EFF",
            "type": 2
        },
        "hintInfo": {
            "type": 1,
            "title": "2件包裹",
            "actioninfo": {
                "actionIcon": "miui.focus.pic_hint",
                "actionTitle": "XX",
                "actionTitleColor": "#FF0000",
                "actionBColor": "#00FF00",
                "actionIntentType": 1,
                "actionIntent": "XXXX"
            }
        }
    }
}
""";
pushRequest.setAndroidXiaomiFocusParam(createFocusParam);

String focusPics = """
{
    "miui.focus.pic_ticker": "https://example.com/ticker.jpg",
    "miui.focus.pic_aod": "https://example.com/aod.jpg",
    "miui.focus.pic_imageText": "https://example.com/imageText.jpg",
    "miui.focus.pic_hint": "https://example.com/hint.jpg"
}
""";
pushRequest.setAndroidXiaomiFocusPics(focusPics);

PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
        pushResponse.getRequestId(), pushResponse.getMessageId());

远程更新超级岛

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);

// 设置远程更新超级岛的参数
pushRequest.setAndroidNotificationNotifyId(1);
pushRequest.setAndroidNotificationXiaomiChannel("130626");
pushRequest.setAndroidPopupTitle("已取件");
pushRequest.setAndroidPopupBody("安宁华庭2区8号底商店菜鸟驿站");
// 兜底通知点击跳转activty,需要接入辅助弹窗
pushRequest.setAndroidPopupActivity("xx.YourAndroidPopupActivity");

String updateFocusParam = """
{
    "param_v2": {
        "protocol": 1,
        "business": "taxi",
        "enableFloat": true,
        "updatable": true,
        "orderId": "A580202509130712",
        "sequence": 2,
        "ticker": "ticker",
        "tickerPic": "miui.focus.pic_ticker",
        "aodTitle": "aodTitle",
        "aodPic": "miui.focus.pic_aod",
        "param_island": {
            "islandProperty": 1,
            "bigIslandArea": {
                "imageTextInfoLeft": {
                    "type": 1,
                    "picInfo": {
                        "type": 1,
                        "pic": "miui.focus.pic_imageText"
                    },
                    "miui.focus.paramtextInfo": {
                        "frontTitle": "充电中",
                        "title": "24%",
                        "content": "剩5分钟",
                        "useHighLight": false
                    }
                },
                "picInfo": {
                    "type": 1,
                    "pic": "miui.focus.pic_imageText"
                }
            },
            "smallIslandArea": {
                "picInfo": {
                    "type": 1,
                    "pic": "miui.focus.pic_imageText"
                }
            },
            "shareData": {
                "title": "share_title"
            }
        },
        "baseInfo": {
            "title": "已取件",
            "content": "安宁华庭2区8号底商店菜鸟驿站",
            "colorTitle": "#006EFF",
            "type": 2
        },
        "hintInfo": {
            "type": 1,
            "title": "2件包裹",
            "actioninfo": {
                "actionIcon": "miui.focus.pic_hint",
                "actionTitle": "XX",
                "actionTitleColor": "#FF0000",
                "actionBColor": "#00FF00",
                "actionIntentType": 1,
                "actionIntent": "XXXX"
            }
        }
    }
}
""";
pushRequest.setAndroidXiaomiFocusParam(updateFocusParam);

String focusPics = """
{
    "miui.focus.pic_ticker": "https://example.com/ticker.jpg",
    "miui.focus.pic_aod": "https://example.com/aod.jpg",
    "miui.focus.pic_imageText": "https://example.com/imageText.jpg",
    "miui.focus.pic_hint": "https://example.com/hint.jpg"
}
""";
pushRequest.setAndroidXiaomiFocusPics(focusPics);

PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
        pushResponse.getRequestId(), pushResponse.getMessageId());

远程结束超级岛

PushRequest pushRequest = new PushRequest();
// 基础参数
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);

// 设置远程结束超级岛的参数
pushRequest.setAndroidNotificationNotifyId(1);
pushRequest.setAndroidNotificationXiaomiChannel("130626");
pushRequest.setAndroidPopupTitle("已结束");
pushRequest.setAndroidPopupBody("本次服务已完成");
// 兜底通知点击跳转activty,需要接入辅助弹窗
pushRequest.setAndroidPopupActivity("xx.YourAndroidPopupActivity");

String stopFocusParam = """
{
    "param_v2": {
        "business": "taxi",
        "cancel": true,
        "orderId": "A580202509130712",
        "sequence": 3
    }
}
""";
pushRequest.setAndroidXiaomiFocusParam(stopFocusParam);

PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
        pushResponse.getRequestId(), pushResponse.getMessageId());

PushV2参数映射

如果您使用PushV2接口,对应字段位于PushTask.Notification.Android.Options.Xiaomi下:

  • Channel:对应Push接口的AndroidNotificationXiaomiChannel。

  • FocusParam:对应Push接口的AndroidXiaomiFocusParam。

  • FocusPics:对应Push接口的AndroidXiaomiFocusPics。

使用PushV2下发超级岛时,还需要填写PushTask.Notification.Android.NotifyIdPushTask.Notification.Android.VendorChannelActivityPushTask.Notification.TitlePushTask.Notification.Body

超级岛限制

  1. 上岛场景通常按照触发时间的先后进行优先级排序:新通知>老通知。

  2. 岛展开态默认展开5s后收起。

  3. 若未设置消失逻辑,则触发兜底逻辑:岛默认1小时消失;通知卡片默认12小时消失。

  4. 通知栏焦点通知卡片无数量限制,平铺展示无折叠。

  5. 小折叠/背屏手机无需单独适配,由小米侧自行适配。

  6. 拖拽分享支持分享至:微信、QQ、短信、浏览器;分享内容:建议“文案+链接”,例如“我正在使用XX打车+URL”。

其他限制请见常见Q&A

问题排查

创建超级岛失败

  1. 检查是否已参考开通小米超级岛服务在小米开发者平台开通小米超级岛服务。

  2. 检查是否已参考常见Q&A中的说明发送邮件申请焦点通知权限。

  3. 参考hasFocusPermission查询当前应用是否开启焦点通知权限。

  4. 根据消息ID与设备ID在移动推送控制台的排查工具->排查消息页面检查超级岛推送链路。

更新超级岛失败

  1. 检查更新时填写的AndroidNotificationNotifyId参数是否与创建时相同。

  2. 根据消息ID与设备ID在移动推送控制台的排查工具->排查消息页面检查超级岛推送链路。

结束超级岛失败

  1. 检查结束时填写的AndroidNotificationNotifyId参数是否与创建时相同。

  2. 检查cancel是否为true

  3. 根据消息ID与设备ID在移动推送控制台的排查工具->排查消息页面检查超级岛推送链路。