开发者社区 问答 正文

移动推送Android SDK:透传消息+用户自建通知最佳实践


移动推送通知目前只能创建普通通知和标准视图的自定义样式通知,无法满足部分复杂的业务需求。如果您的App需要创建较为复杂的消息通知,建议使用移动推送透传消息,并在接收到消息后自行创建通知,本文为您提供移动推送SDK透传消息+自建通知的最佳实践。

1. 服务端推送透传消息


服务端推送时选择推送消息:

  1. [backcolor=transparent]PushRequest[backcolor=transparent] pushRequest [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]PushRequest[backcolor=transparent]();
  2. [backcolor=transparent]// 推送目标
  3. [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setAppKey[backcolor=transparent]([backcolor=transparent]appKey[backcolor=transparent]);
  4. [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setTarget[backcolor=transparent]([backcolor=transparent]"DEVICE"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]//推送目标: device:推送给设备; account:推送给指定帐号,tag:推送给自定义标签; all: 推送给全部
  5. [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个的限制)
  6. [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setPushType[backcolor=transparent]([backcolor=transparent]"MESSAGE"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 消息类型 MESSAGE NOTICE
  7. [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setDeviceType[backcolor=transparent]([backcolor=transparent]"ANDROID"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 设备类型 ANDROID iOS ALL.
  8. [backcolor=transparent]// 推送配置
  9. [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setTitle[backcolor=transparent]([backcolor=transparent]"ALi Push Title"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 消息的标题
  10. [backcolor=transparent]pushRequest[backcolor=transparent].[backcolor=transparent]setBody[backcolor=transparent]([backcolor=transparent]"Ali Push Body"[backcolor=transparent]);[backcolor=transparent] [backcolor=transparent]// 消息的内容
  11. [backcolor=transparent]......


2. 在onMessage回调中接收消息


透传消息会通过onMessage回调接口透出,可以在onMessage接口中创建通知
  1. [backcolor=transparent]    [backcolor=transparent]/**
  2. [backcolor=transparent]     * 推送消息的回调方法
  3. [backcolor=transparent]     *
  4. [backcolor=transparent]     * @param context
  5. [backcolor=transparent]     * @param cPushMessage
  6. [backcolor=transparent]     */
  7. [backcolor=transparent]    [backcolor=transparent]@Override
  8. [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]{
  9. [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]());
  10. [backcolor=transparent]      buildNotification[backcolor=transparent]([backcolor=transparent]context[backcolor=transparent],[backcolor=transparent] cPushMessage[backcolor=transparent])
  11. [backcolor=transparent]    [backcolor=transparent]}


3. 创建自建通知


创建自建通知可以参考以下代码:
  1. [backcolor=transparent]    [backcolor=transparent]/**
  2. [backcolor=transparent]     * 接受到对应消息后,消息的弹出处理
  3. [backcolor=transparent]     */
  4. [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]{
  5. [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]);
  6. [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]);
  7. [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]);
  8. [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]());
  9. [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]());
  10. [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]()));
  11. [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])
  12. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]setContent[backcolor=transparent]([backcolor=transparent]remoteViews[backcolor=transparent])
  13. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]setContentTitle[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent].[backcolor=transparent]getTitle[backcolor=transparent]())
  14. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]setContentText[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent].[backcolor=transparent]getContent[backcolor=transparent]())
  15. [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])
  16. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]setDefaults[backcolor=transparent]([backcolor=transparent]Notification[backcolor=transparent].[backcolor=transparent]DEFAULT_VIBRATE[backcolor=transparent])
  17. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]setPriority[backcolor=transparent]([backcolor=transparent]Notification[backcolor=transparent].[backcolor=transparent]PRIORITY_DEFAULT[backcolor=transparent])
  18. [backcolor=transparent]                [backcolor=transparent].[backcolor=transparent]build[backcolor=transparent]();
  19. [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]);
  20. [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]);
  21. [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]);
  22. [backcolor=transparent]    [backcolor=transparent]}
  23. [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]{
  24. [backcolor=transparent]        [backcolor=transparent]Intent[backcolor=transparent] clickIntent [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]Intent[backcolor=transparent]();
  25. [backcolor=transparent]        clickIntent[backcolor=transparent].[backcolor=transparent]setAction[backcolor=transparent]([backcolor=transparent]"your notification click action"[backcolor=transparent]);
  26. [backcolor=transparent]        [backcolor=transparent]//添加其他数据
  27. [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中,方便通知自建通知的点击事件
  28. [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]);
  29. [backcolor=transparent]}
  30. [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]{
  31. [backcolor=transparent]        [backcolor=transparent]Intent[backcolor=transparent] deleteIntent [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent] [backcolor=transparent]Intent[backcolor=transparent]();
  32. [backcolor=transparent]        deleteIntent[backcolor=transparent].[backcolor=transparent]setAction[backcolor=transparent]([backcolor=transparent]"your notification click action"[backcolor=transparent]);
  33. [backcolor=transparent]        [backcolor=transparent]//添加其他数据
  34. [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中,方便通知自建通知的点击事件
  35. [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]);
  36. [backcolor=transparent]}


4. 创建通知点击/删除事件接收Service


在创建的通知被点击或删除时会分别触发对应的intent,发送给接收该intent的service。所以接下来需要创建接收对应事件的Service:
  1. [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]{
  2. [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];
  3. [backcolor=transparent]    [backcolor=transparent]@Override
  4. [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]{
  5. [backcolor=transparent]        [backcolor=transparent]String[backcolor=transparent] action [backcolor=transparent]=[backcolor=transparent] intent[backcolor=transparent].[backcolor=transparent]getAction[backcolor=transparent]();
  6. [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]{
  7. [backcolor=transparent]          [backcolor=transparent]//添加您的通知点击处理逻辑
  8. [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
  9. [backcolor=transparent]        [backcolor=transparent]PushServiceFactory[backcolor=transparent].[backcolor=transparent]getCloudPushService[backcolor=transparent]().[backcolor=transparent]clickMessage[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent]);[backcolor=transparent]//上报通知点击事件,点击事件相关信息可以在推送控制台查看到
  10. [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]{
  11. [backcolor=transparent]          [backcolor=transparent]//添加您的通知删除处理逻辑
  12. [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
  13. [backcolor=transparent]        [backcolor=transparent]PushServiceFactory[backcolor=transparent].[backcolor=transparent]getCloudPushService[backcolor=transparent]().[backcolor=transparent]dismissMessage[backcolor=transparent]([backcolor=transparent]message[backcolor=transparent]);[backcolor=transparent]//上报通知删除事件,点击事件相关信息可以在推送控制台查看到
  14. [backcolor=transparent]        [backcolor=transparent]}
  15. [backcolor=transparent]    [backcolor=transparent]}
  16. [backcolor=transparent]}

在AndroidManifest.xml文件中注册该Service:
  1. [backcolor=transparent]<service
  2. [backcolor=transparent]  [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"NotificationService"
  3. [backcolor=transparent]  [backcolor=transparent]android:exported[backcolor=transparent]=[backcolor=transparent]"false"[backcolor=transparent]>
  4. [backcolor=transparent]  [backcolor=transparent]<intent-filter>
  5. [backcolor=transparent]    [backcolor=transparent]<action[backcolor=transparent] [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"your notification click action"[backcolor=transparent] [backcolor=transparent]/>
  6. [backcolor=transparent]  [backcolor=transparent]</intent-filter>
  7. [backcolor=transparent]  [backcolor=transparent]<intent-filter>
  8. [backcolor=transparent]    [backcolor=transparent]<action[backcolor=transparent] [backcolor=transparent]android:name[backcolor=transparent]=[backcolor=transparent]"your notification delete action"[backcolor=transparent] [backcolor=transparent]/>
  9. [backcolor=transparent]  [backcolor=transparent]</intent-filter>
  10. [backcolor=transparent]</service>


5. 注意事项

  • 如果需要将自建通知的删除/点击事件统计上报到阿里云推送控制台,必须完成以下几个步骤,具体代码可以参考上文:将onMessage回调透出的CPushMessage实例放到点击和删除事件intent中,CPushMessage实现了Parcelable接口,可以直接通过Intent.putExtra方法添加
  • 在通知点击/删除事件处理逻辑中先从intent获取到传入的CPushMessage实例,再调用CloudPushService.clickMessage/dismissMessage接口上报
CloudPushService.clickMessage/dismissMessage对于一条消息重复上报存在事件覆盖,所以请确保一条消息只调用一次clickMessage或dismissMessage接口如果使用阿里云移动推送发送通知无需手动上报点击和删除事件

展开
收起
猫饭先生 2017-10-23 11:19:45 1886 分享 版权
0 条回答
写回答
取消 提交回答