移动推送通知目前只能创建普通通知和标准视图的自定义样式通知,无法满足部分复杂的业务需求。如果您的App需要创建较为复杂的消息通知,建议使用移动推送透传消息,并在接收到消息后自行创建通知,本文为您提供移动推送SDK透传消息+自建通知的最佳实践。
1. 服务端推送透传消息
服务端推送时选择推送消息:
- [backcolor=transparent]PushRequest[backcolor=transparent] pushRequest [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]PushRequest[backcolor=transparent]();
- [backcolor=transparent]// 推送目标
- [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setAppKey[backcolor=transparent]([backcolor=transparent]appKey[backcolor=transparent]);
- [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setTarget[backcolor=transparent]([backcolor=transparent]"DEVICE"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]//推送目标: device:推送给设备; account:推送给指定帐号,tag:推送给自定义标签; all: 推送给全部
- [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setTargetValue[backcolor=transparent]([backcolor=transparent]"deviceId"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]//根据Target来设定,如Target=device, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
- [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setPushType[backcolor=transparent]([backcolor=transparent]"MESSAGE"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 消息类型 MESSAGE NOTICE
- [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setDeviceType[backcolor=transparent]([backcolor=transparent]"ANDROID"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 设备类型 ANDROID iOS ALL.
- [backcolor=transparent]// 推送配置
- [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setTitle[backcolor=transparent]([backcolor=transparent]"ALi Push Title"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 消息的标题
- [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setBody[backcolor=transparent]([backcolor=transparent]"Ali Push Body"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 消息的内容
- [backcolor=transparent]......
2. 在onMessage回调中接收消息
透传消息会通过onMessage回调接口透出,可以在onMessage接口中创建通知
- [backcolor=transparent] [backcolor=transparent]/**
- [backcolor=transparent] * 推送消息的回调方法
- [backcolor=transparent] *
- [backcolor=transparent] * @param context
- [backcolor=transparent] * @param cPushMessage
- [backcolor=transparent] */
- [backcolor=transparent] [backcolor=transparent]@Override
- [backcolor=transparent] [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] onMessage[backcolor=transparent]([backcolor=transparent]Context[backcolor=transparent] context[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]CPushMessage[backcolor=transparent] cPushMessage[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]Log[backcolor=transparent].[backcolor=transparent]e[backcolor=transparent]([backcolor=transparent]"MyMessageReceiver"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"onMessage, messageId: "[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] cPushMessage[backcolor=transparent].[backcolor=transparent]getMessageId[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]", title: "[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] cPushMessage[backcolor=transparent].[backcolor=transparent]getTitle[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]", content:"[backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] cPushMessage[backcolor=transparent].[backcolor=transparent]getContent[backcolor=transparent]());
- [backcolor=transparent] buildNotification[backcolor=transparent]([backcolor=transparent]context[backcolor=transparent],[backcolor=transparent] cPushMessage[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]}
3. 创建自建通知
创建自建通知可以参考以下代码:
- [backcolor=transparent] [backcolor=transparent]/**
- [backcolor=transparent] * 接受到对应消息后,消息的弹出处理
- [backcolor=transparent] */
- [backcolor=transparent] [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]void[backcolor=transparent] buildNotification[backcolor=transparent]([backcolor=transparent]Context[backcolor=transparent] context[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]CPushMessage[backcolor=transparent] message[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]NotificationManager[backcolor=transparent] notificationManager [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]NotificationManager[backcolor=transparent])[backcolor=transparent] context[backcolor=transparent].[backcolor=transparent]getSystemService[backcolor=transparent]([backcolor=transparent]NOTIFICATION_SERVICE[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]RemoteViews[backcolor=transparent] remoteViews [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]RemoteViews[backcolor=transparent]([backcolor=transparent]getPackageName[backcolor=transparent](),[backcolor=transparent] R[backcolor=transparent].[backcolor=transparent]layout[backcolor=transparent].[backcolor=transparent]view_custom[backcolor=transparent]);
- [backcolor=transparent] remoteViews[backcolor=transparent].[backcolor=transparent]setImageViewResource[backcolor=transparent]([backcolor=transparent]R[backcolor=transparent].[backcolor=transparent]id[backcolor=transparent].[backcolor=transparent]custom_icon[backcolor=transparent],[backcolor=transparent] R[backcolor=transparent].[backcolor=transparent]mipmap[backcolor=transparent].[backcolor=transparent]ic_launcher[backcolor=transparent]);
- [backcolor=transparent] remoteViews[backcolor=transparent].[backcolor=transparent]setTextViewText[backcolor=transparent]([backcolor=transparent]R[backcolor=transparent].[backcolor=transparent]id[backcolor=transparent].[backcolor=transparent]tv_custom_title[backcolor=transparent],[backcolor=transparent] message[backcolor=transparent].[backcolor=transparent]getTitle[backcolor=transparent]());
- [backcolor=transparent] remoteViews[backcolor=transparent].[backcolor=transparent]setTextViewText[backcolor=transparent]([backcolor=transparent]R[backcolor=transparent].[backcolor=transparent]id[backcolor=transparent].[backcolor=transparent]tv_custom_content[backcolor=transparent],[backcolor=transparent] message[backcolor=transparent].[backcolor=transparent]getContent[backcolor=transparent]());
- [backcolor=transparent] remoteViews[backcolor=transparent].[backcolor=transparent]setTextViewText[backcolor=transparent]([backcolor=transparent]R[backcolor=transparent].[backcolor=transparent]id[backcolor=transparent].[backcolor=transparent]tv_custom_time[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]SimpleDateFormat[backcolor=transparent]([backcolor=transparent]"HH:mm"[backcolor=transparent]).[backcolor=transparent]format[backcolor=transparent]([backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]Date[backcolor=transparent]()));
- [backcolor=transparent] [backcolor=transparent]Notification[backcolor=transparent] notification [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]NotificationCompat[backcolor=transparent].[backcolor=transparent]Builder[backcolor=transparent]([backcolor=transparent]context[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent].[backcolor=transparent]setContent[backcolor=transparent]([backcolor=transparent]remoteViews[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent].[backcolor=transparent]setContentTitle[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent].[backcolor=transparent]getTitle[backcolor=transparent]())
- [backcolor=transparent] [backcolor=transparent].[backcolor=transparent]setContentText[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent].[backcolor=transparent]getContent[backcolor=transparent]())
- [backcolor=transparent] [backcolor=transparent].[backcolor=transparent]setSmallIcon[backcolor=transparent]([backcolor=transparent]R[backcolor=transparent].[backcolor=transparent]mipmap[backcolor=transparent].[backcolor=transparent]ic_launcher[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent].[backcolor=transparent]setDefaults[backcolor=transparent]([backcolor=transparent]Notification[backcolor=transparent].[backcolor=transparent]DEFAULT_VIBRATE[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent].[backcolor=transparent]setPriority[backcolor=transparent]([backcolor=transparent]Notification[backcolor=transparent].[backcolor=transparent]PRIORITY_DEFAULT[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent].[backcolor=transparent]build[backcolor=transparent]();
- [backcolor=transparent] notification[backcolor=transparent].[backcolor=transparent]contentIntent [backcolor=transparent]=[backcolor=transparent] buildClickContent[backcolor=transparent]([backcolor=transparent]context[backcolor=transparent],[backcolor=transparent] message[backcolor=transparent]);
- [backcolor=transparent] notification[backcolor=transparent].[backcolor=transparent]deleteIntent [backcolor=transparent]=[backcolor=transparent] buildDeleteContent[backcolor=transparent]([backcolor=transparent]context[backcolor=transparent],[backcolor=transparent] message[backcolor=transparent]);
- [backcolor=transparent] notificationManager[backcolor=transparent].[backcolor=transparent]notify[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent].[backcolor=transparent]hashCode[backcolor=transparent](),[backcolor=transparent] notification[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]PendingIntent[backcolor=transparent] buildClickContent[backcolor=transparent]([backcolor=transparent]Context[backcolor=transparent] context[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]CPushMessage[backcolor=transparent] message[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]Intent[backcolor=transparent] clickIntent [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]Intent[backcolor=transparent]();
- [backcolor=transparent] clickIntent[backcolor=transparent].[backcolor=transparent]setAction[backcolor=transparent]([backcolor=transparent]"your notification click action"[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]//添加其他数据
- [backcolor=transparent] clickIntent[backcolor=transparent].[backcolor=transparent]putExtra[backcolor=transparent]([backcolor=transparent]"message key"[backcolor=transparent],[backcolor=transparent] message[backcolor=transparent]);[backcolor=transparent]//将message放入intent中,方便通知自建通知的点击事件
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]PendingIntent[backcolor=transparent].[backcolor=transparent]getService[backcolor=transparent]([backcolor=transparent]context[backcolor=transparent],[backcolor=transparent] clickNotificationCode[backcolor=transparent],[backcolor=transparent] clickIntent[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]PendingIntent[backcolor=transparent].[backcolor=transparent]FLAG_UPDATE_CURRENT[backcolor=transparent]);
- [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]PendingIntent[backcolor=transparent] buildDeleteContent[backcolor=transparent]([backcolor=transparent]Context[backcolor=transparent] context[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]CPushMessage[backcolor=transparent] message[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]Intent[backcolor=transparent] deleteIntent [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]Intent[backcolor=transparent]();
- [backcolor=transparent] deleteIntent[backcolor=transparent].[backcolor=transparent]setAction[backcolor=transparent]([backcolor=transparent]"your notification click action"[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]//添加其他数据
- [backcolor=transparent] deleteIntent[backcolor=transparent].[backcolor=transparent]putExtra[backcolor=transparent]([backcolor=transparent]"message key"[backcolor=transparent],[backcolor=transparent] message[backcolor=transparent]);[backcolor=transparent]//将message放入intent中,方便通知自建通知的点击事件
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]PendingIntent[backcolor=transparent].[backcolor=transparent]getService[backcolor=transparent]([backcolor=transparent]context[backcolor=transparent],[backcolor=transparent] clickNotificationCode[backcolor=transparent],[backcolor=transparent] deleteIntent[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]PendingIntent[backcolor=transparent].[backcolor=transparent]FLAG_UPDATE_CURRENT[backcolor=transparent]);
- [backcolor=transparent]}
4. 创建通知点击/删除事件接收Service
在创建的通知被点击或删除时会分别触发对应的intent,发送给接收该intent的service。所以接下来需要创建接收对应事件的Service:
- [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]NotificationService[backcolor=transparent] [backcolor=transparent]extends[backcolor=transparent] [backcolor=transparent]Service[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]static[backcolor=transparent] [backcolor=transparent]final[backcolor=transparent] [backcolor=transparent]String[backcolor=transparent] TAG [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"NotificationService"[backcolor=transparent] [backcolor=transparent];
- [backcolor=transparent] [backcolor=transparent]@Override
- [backcolor=transparent] [backcolor=transparent]public[backcolor=transparent] [backcolor=transparent]int[backcolor=transparent] onStartCommand[backcolor=transparent]([backcolor=transparent]Intent[backcolor=transparent] intent[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]int[backcolor=transparent] flags[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]int[backcolor=transparent] startId[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]String[backcolor=transparent] action [backcolor=transparent]=[backcolor=transparent] intent[backcolor=transparent].[backcolor=transparent]getAction[backcolor=transparent]();
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]action[backcolor=transparent].[backcolor=transparent]equals[backcolor=transparent]([backcolor=transparent]"your notification click action"[backcolor=transparent]))[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]//添加您的通知点击处理逻辑
- [backcolor=transparent] [backcolor=transparent]CPushMessage[backcolor=transparent] message [backcolor=transparent]=[backcolor=transparent] intent[backcolor=transparent].[backcolor=transparent]getParcelableExtra[backcolor=transparent]([backcolor=transparent]"message key"[backcolor=transparent]);[backcolor=transparent]//获取message
- [backcolor=transparent] [backcolor=transparent]PushServiceFactory[backcolor=transparent].[backcolor=transparent]getCloudPushService[backcolor=transparent]().[backcolor=transparent]clickMessage[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent]);[backcolor=transparent]//上报通知点击事件,点击事件相关信息可以在推送控制台查看到
- [backcolor=transparent] [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]if[backcolor=transparent]([backcolor=transparent]action[backcolor=transparent].[backcolor=transparent]equals[backcolor=transparent]([backcolor=transparent]"your notification delete action"[backcolor=transparent]))[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]//添加您的通知删除处理逻辑
- [backcolor=transparent] [backcolor=transparent]CPushMessage[backcolor=transparent] message [backcolor=transparent]=[backcolor=transparent] intent[backcolor=transparent].[backcolor=transparent]getParcelableExtra[backcolor=transparent]([backcolor=transparent]"message key"[backcolor=transparent]);[backcolor=transparent]//获取message
- [backcolor=transparent] [backcolor=transparent]PushServiceFactory[backcolor=transparent].[backcolor=transparent]getCloudPushService[backcolor=transparent]().[backcolor=transparent]dismissMessage[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent]);[backcolor=transparent]//上报通知删除事件,点击事件相关信息可以在推送控制台查看到
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent]}
在AndroidManifest.xml文件中注册该Service:
- [backcolor=transparent]<service
- [backcolor=transparent] [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"NotificationService"
- [backcolor=transparent] [backcolor=transparent]android:exported[backcolor=transparent]=[backcolor=transparent]"false"[backcolor=transparent]>
- [backcolor=transparent] [backcolor=transparent]<intent-filter>
- [backcolor=transparent] [backcolor=transparent]<action[backcolor=transparent] [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"your notification click action"[backcolor=transparent] [backcolor=transparent]/>
- [backcolor=transparent] [backcolor=transparent]</intent-filter>
- [backcolor=transparent] [backcolor=transparent]<intent-filter>
- [backcolor=transparent] [backcolor=transparent]<action[backcolor=transparent] [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"your notification delete action"[backcolor=transparent] [backcolor=transparent]/>
- [backcolor=transparent] [backcolor=transparent]</intent-filter>
- [backcolor=transparent]</service>
5. 注意事项
- 如果需要将自建通知的删除/点击事件统计上报到阿里云推送控制台,必须完成以下几个步骤,具体代码可以参考上文:将onMessage回调透出的CPushMessage实例放到点击和删除事件intent中,CPushMessage实现了Parcelable接口,可以直接通过Intent.putExtra方法添加
- 在通知点击/删除事件处理逻辑中先从intent获取到传入的CPushMessage实例,再调用CloudPushService.clickMessage/dismissMessage接口上报
CloudPushService.clickMessage/dismissMessage对于一条消息重复上报存在事件覆盖,所以请确保一条消息只调用一次clickMessage或dismissMessage接口如果使用阿里云移动推送发送通知无需手动上报点击和删除事件