全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
移动推送

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

更新时间:2017-08-01 16:20:21

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

1. 服务端推送透传消息

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

  1. PushRequest pushRequest = new PushRequest();
  2. // 推送目标
  3. pushRequest.setAppKey(appKey);
  4. pushRequest.setTarget("DEVICE"); //推送目标: device:推送给设备; account:推送给指定帐号,tag:推送给自定义标签; all: 推送给全部
  5. pushRequest.setTargetValue("deviceId"); //根据Target来设定,如Target=device, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
  6. pushRequest.setPushType("MESSAGE"); // 消息类型 MESSAGE NOTICE
  7. pushRequest.setDeviceType("ANDROID"); // 设备类型 ANDROID iOS ALL.
  8. // 推送配置
  9. pushRequest.setTitle("ALi Push Title"); // 消息的标题
  10. pushRequest.setBody("Ali Push Body"); // 消息的内容
  11. ......

2. 在onMessage回调中接收消息

透传消息会通过onMessage回调接口透出,可以在onMessage接口中创建通知

  1. /**
  2. * 推送消息的回调方法
  3. *
  4. * @param context
  5. * @param cPushMessage
  6. */
  7. @Override
  8. public void onMessage(Context context, CPushMessage cPushMessage) {
  9. Log.e("MyMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
  10. buildNotification(context, cPushMessage)
  11. }

3. 创建自建通知

创建自建通知可以参考以下代码:

  1. /**
  2. * 接受到对应消息后,消息的弹出处理
  3. */
  4. public void buildNotification(Context context, CPushMessage message) {
  5. NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
  6. RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_custom);
  7. remoteViews.setImageViewResource(R.id.custom_icon, R.mipmap.ic_launcher);
  8. remoteViews.setTextViewText(R.id.tv_custom_title, message.getTitle());
  9. remoteViews.setTextViewText(R.id.tv_custom_content, message.getContent());
  10. remoteViews.setTextViewText(R.id.tv_custom_time, new SimpleDateFormat("HH:mm").format(new Date()));
  11. Notification notification = new NotificationCompat.Builder(context)
  12. .setContent(remoteViews)
  13. .setContentTitle(message.getTitle())
  14. .setContentText(message.getContent())
  15. .setSmallIcon(R.mipmap.ic_launcher)
  16. .setDefaults(Notification.DEFAULT_VIBRATE)
  17. .setPriority(Notification.PRIORITY_DEFAULT)
  18. .build();
  19. notification.contentIntent = buildClickContent(context, message);
  20. notification.deleteIntent = buildDeleteContent(context, message);
  21. notificationManager.notify(message.hashCode(), notification);
  22. }
  23. public PendingIntent buildClickContent(Context context, CPushMessage message) {
  24. Intent clickIntent = new Intent();
  25. clickIntent.setAction("your notification click action");
  26. //添加其他数据
  27. clickIntent.putExtra("message key", message);//将message放入intent中,方便通知自建通知的点击事件
  28. return PendingIntent.getService(context, clickNotificationCode, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  29. }
  30. public PendingIntent buildDeleteContent(Context context, CPushMessage message) {
  31. Intent deleteIntent = new Intent();
  32. deleteIntent.setAction("your notification click action");
  33. //添加其他数据
  34. deleteIntent.putExtra("message key", message);//将message放入intent中,方便通知自建通知的点击事件
  35. return PendingIntent.getService(context, clickNotificationCode, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  36. }

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

在创建的通知被点击或删除时会分别触发对应的intent,发送给接收该intent的service。所以接下来需要创建接收对应事件的Service:

  1. public class NotificationService extends Service {
  2. public static final String TAG = "NotificationService" ;
  3. @Override
  4. public int onStartCommand(Intent intent, int flags, int startId) {
  5. String action = intent.getAction();
  6. if (action.equals("your notification click action")) {
  7. //添加您的通知点击处理逻辑
  8. CPushMessage message = intent.getParcelableExtra("message key");//获取message
  9. PushServiceFactory.getCloudPushService().clickMessage(message);//上报通知点击事件,点击事件相关信息可以在推送控制台查看到
  10. } else if(action.equals("your notification delete action")) {
  11. //添加您的通知删除处理逻辑
  12. CPushMessage message = intent.getParcelableExtra("message key");//获取message
  13. PushServiceFactory.getCloudPushService().dismissMessage(message);//上报通知删除事件,点击事件相关信息可以在推送控制台查看到
  14. }
  15. }
  16. }

在AndroidManifest.xml文件中注册该Service:

  1. <service
  2. android:name="NotificationService"
  3. android:exported="false">
  4. <intent-filter>
  5. <action android:name="your notification click action" />
  6. </intent-filter>
  7. <intent-filter>
  8. <action android:name="your notification delete action" />
  9. </intent-filter>
  10. </service>

5. 注意事项

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