一、 开通开发者
省略
二、 创建应用
省略,创建完应用,到“推送服务”开启你的应用推送服务。
三、 集成到Android项目
《Android客户端SDK集成指南》。
小米的SDK集成还算简单,小米提供了一个简单的Demo,非常简单。
0. 引入jar包依赖
Android的SDK以jar形式提供,放到libs目录即可。
1. 推送服务需要的权限列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE"/>
<permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" android:protectionLevel="signature" />
<uses-permission android:name="com.xiaomi.mipushdemo.permission.MIPUSH_RECEIVE" />
|
2. 推送服务需要配置的service和receiver:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <service android:name="com.xiaomi.push.service.XMPushService" android:enabled="true" android:process=":pushservice" />
<service android:name="com.xiaomi.push.service.XMJobService" android:enabled="true" android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE" android:process=":pushservice" />
<service android:name="com.xiaomi.mipush.sdk.PushMessageHandler" android:enabled="true" android:exported="true" />
<service android:name="com.xiaomi.mipush.sdk.MessageHandleService" android:enabled="true" />
<receiver android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver" android:exported="true"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver>
<receiver android:name="com.xiaomi.push.service.receivers.PingReceiver" android:exported="false" android:process=":pushservice"> <intent-filter> <action android:name="com.xiaomi.push.PING_TIMER" /> </intent-filter> </receiver>
|
这里将XMPushService和PingReceiver定义在了pushservice进程中,您也可以配置其运行在任意进程。如果没有配置android:process这个属性,那么它们将运行在应用的主进程中。
2. 自定义一个BroadcastReceiver类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class MyMiPushMessageReceiver : PushMessageReceiver() {
override fun onReceiveRegisterResult(context: Context, message: MiPushCommandMessage) { Log.i(TAG, "onReceiveRegisterResult is called. $message")
}
override fun onReceivePassThroughMessage(context: Context, message: MiPushMessage) { Log.v(TAG,"onReceivePassThroughMessage is called. $message") }
override fun onNotificationMessageClicked(context: Context, message: MiPushMessage) { Log.v(TAG,"onNotificationMessageClicked is called. $message") }
override fun onNotificationMessageArrived(context: Context, message: MiPushMessage) { Log.v(TAG,"onNotificationMessageArrived is called. $message") }
override fun onCommandResult(context: Context, message: MiPushCommandMessage) { Log.d(TAG, "onCommandResult is called. $message") } }
|
3. 将自定义的BroadcastReceiver注册到AndroidManifest.xml文件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <receiver android:exported="true" android:name="com.xiaomi.mipushdemo.DemoMessageReceiver"> <intent-filter> <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" /> </intent-filter> <intent-filter> <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" /> </intent-filter> <intent-filter> <action android:name="com.xiaomi.mipush.ERROR" /> </intent-filter> </receiver>
|
4. 代码混淆
1
| -keep class com.xiaomi.mipush.sdk.DemoMessageReceiver {*;}
|
5. 注册推送
1 2
| MiPushClient.registerPush(this, APP_ID, APP_KEY);
|
注册成功在回调中有regid,可以根据regid推送给指定的设备。
四、 后台推送
小米有提供SDK,也有HTTP API,这里直接用API就可以。API的授权也是很简单,只需要应用的秘钥就行。
五、 预定义通知栏消息的点击行为
通过设置extra.notify_effect的值以得到不同的预定义点击行为。
- “1″:通知栏点击后打开app的Launcher Activity。
- “2″:通知栏点击后打开app的任一Activity(开发者还需要传入extra.intent_uri)。
- “3″:通知栏点击后打开网页(开发者还需要传入extra.web_uri)。
extra.notify_effect为“2”时,可以定义extra.intent_uri,生成uri代码如下:
1 2 3 4 5
| Intent intent = new Intent(); intent.setAction("com.xiaomi.mipushdemo.news"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.toUri(Intent.URI_INTENT_SCHEME); 结果:intent:#Intent;action=com.test.action.message;end
|
经过我的小米手机测试,无法打开此action。但如果定义extra.intent_uri为以下格式的Activity,是可以打开:
1
| intent:#Intent;component=com.xiaomi.mipushdemo/.NewsActivity;end
|
只是设置的parentActivityName没有效果,打开NewsActivity点击返回就退出了,如果想退出NewsActivity进入主页则不行。
但还有一种方法可以实现,就是onNotificationMessageClicked函数,这个函数是点击通知栏消息的回调函数,如果没有被小米SDK处理掉的话,就会触发,我们就可以执行相关的代码。
如:
1 2 3 4 5
| Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(message.getExtra().get("intent_uri")); context.startActivity(intent);
|
推送时,extra.notify_effect这个参数要删掉
intent_uri参数填:com.xiaomi.mipushdemo.news
这样就可以启动Action了,parentActivityName也是有效的。
六、 定制通知栏通知的图标
- 非MIUI中
- 如果app中同时存在名为
mipush_notification
和 mipush_small_notification
的drawable文件,则使用mipush_notification的drawable作为通知的大图标,mipush_small_notification的drawable作为通知的小图标。
- 如果app中只存在其中一个drawable文件,则使用该drawable作为通知的图标。
- 如果app中不存在这两个drawable文件,则使用app的icon作为通知的图标。
注意:
mipush_notification 要求PNG/JPG/JPEG格式图片,尺寸120×120px,小于200KB。
mipush_small_notification 建议尺寸 60 x 60px。
- MIUI中:
通知栏图标统一显示为app的icon,不可以定制 (2021-07-22无语)。
MIUI经过了几次的修改,参考文章:《知乎》
- 推送消息时指定图标
从小米的推送调试工具来看,可以上传一个定制的icon,但这也太麻烦了。
总结:也就是说,目前通知栏的图标无法定制,不用折腾了(非MIUI根本不会用小米推送好吧?),当然app中可以提前适配定制,万一明天小米又改回来了呢?
七、 透传消息
小米的透传消息要求应用在后台常驻,则无法用来做离线推送。