对于已接入厂商通道,并且运行在对应厂商手机上的应用,服务端推送消息时默认优先推向厂商通道;对于其他应用,服务端推送消息时会推向自建通道。
自建通道收到消息后,推送 SDK 会自动发出通知,用户点击后可自动打开网页。
重要推送 SDK 使用的通知 ID 从 10000 开始,请确保您使用的其他通知 ID 不会与之冲突。
厂商通道收到消息后手机系统会自动发出通知,推送 SDK 和开发者都无法干预,只有当用户点击通知后,推送 SDK 才能收到消息,并自动打开网页,如需:
前提条件
本文中的
MPPushMsgServiceAdapter
方法仅适用于基线 10.1.68.32 及以上版本。若当前使用的基线版本低于 10.1.68.32,可参考 mPaaS 升级指南 升级基线版本。旧版本中的
AliPushRcvService
方法仍可继续使用,如需查看旧版本文档,可 单击此处下载。
跳转应用内页面
如需跳转到应用内的指定页面,可以在推送消息的跳转地址里填入自定义的 DeepLink,例如 mpaas://navigate
,同时在应用内设置一个路由 Activity 来接收 DeepLink,再分发到其他页面。
路由 Activity 需要在 AndroidManifest.xml
中添加相应的 intent-filter
,例如:
<activity android:name=".push.LauncherActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mpaas" />
</intent-filter>
</activity>
路由 Activity 中获取 URI 和消息:
Uri uri = intent.getData();
MPPushMsg msg = intent.getParcelableExtra("mp_push_msg");
自定义消息处理
如需处理消息,可以重写 MPPushMsgServiceAdapter
的 onMessageReceive
和 onChannelMessageClick
方法:
public class MyPushMsgService extends MPPushMsgServiceAdapter {
/**
* 自建通道收到消息的回调(非厂商通道)
*
* @param msg 收到的消息
* @return 是否处理了消息:
* 返回 true,则 SDK 不会处理消息,开发者需根据需求处理收到的消息,包括发通知和通知点击后的跳转
* 返回 false,则 SDK 会自动发通知和添加通知点击后的跳转
*/
@Override
protected boolean onMessageReceive(MPPushMsg msg) {
Log.d("从自建通道收到消息:" + msg.toString());
// 处理消息,例如发自定义通知
return true;
}
/**
* 厂商通道的消息展示在通知栏,通知被点击后的回调
*
* @param msg 收到的消息
* @return 是否处理了消息的点击:
* 返回 true,则 SDK 不会处理厂商通道的通知点击,开发者需根据需求处理点击后的跳转
* 返回 false,则 SDK 会自动处理通知点击后的跳转
*/
@Override
protected boolean onChannelMessageClick(MPPushMsg msg) {
Log.d("从厂商通道到的消息被点击:" + msg.toString());
// 处理被点击后的逻辑
return true;
}
}
其中 MPPushMsg
封装了消息的所有参数:
String id = msg.getId(); // 消息 ID
boolean isSilent = msg.isSilent(); // 是否静默消息
String title = msg.getTitle(); // 消息标题
String content = msg.getContent(); // 消息内容
String action = msg.getAction(); // 跳转类型,0:URL;1:自定义 DeepLink
String url = msg.getUrl(); // 跳转地址,URL 或 DeepLink
int pushStyle = msg.getPushStyle(); // 消息类型,0:普通消息,1:大文本消息,2:图文消息
String iconUrl = msg.getIconUrl(); // 图文消息的小图标
String imageUrl = msg.getImageUrl(); // 图文消息的图片
String customId = msg.getCustomId(); // 自定义的消息 ID
String params = msg.getParams(); // 扩展参数
如处理消息后,可能还需要上报消息埋点,否则控制台的推送使用分析将无法统计到正确的数据:
MPPush.reportPushOpen(msg); // 上报消息被打开
MPPush.reportPushIgnored(msg); // 上报消息被忽略
其中,对于自建通道的消息:
静默消息,无需上报。
非静默消息,需要上报被打开和被忽略的消息,可通过
Notification.Builder
的setContentIntent
、setDeleteIntent
方法或其他有效方式来监听消息被用户打开和忽略。
对于厂商通道的消息,无需上报。