0

我已经使用 fcm 实现了推送通知,但我希望通知类似于 Flipkart,如果我向用户发布一些优惠和交易,如果用户单击推送通知,则必须重定向到该页面。我该如何实施?

4

2 回答 2

0

所以首先你需要一个独特的标签,例如。在通知中接收到的有效负载中的 notification_type 或类型等,此类型用于将 PendingIntent 定向到应重定向的位置。因此,假设您熟悉 FirebaseMessagingService,您正在管理类中的通知,该类FirebaseMessagingService 现在在该类中扩展定义这里的对象PendingIntent是步骤

 private PendingIntent pendingIntent = null;

像这样处理通知

 public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See showChatNotification method below.

    //Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
    // Log.d(TAG, "From: " + remoteMessage.getFrom());

    //Logger.d(TAG + " getData: " + remoteMessage.getData().toString());
    //Logger.d(TAG + " getData: " + remoteMessage.getNotification().getBody());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        Map<String, String> data = remoteMessage.getData();
        setNotification(data);
    } else {
        Log.e(TAG, "Notificaiton");
    }
}

在这里,我创建了setNotification(data); 在收到通知时执行事件的方法

 private void showOtherNotification(Map<String, String> data) {
    Date now = new Date();
    uniqueId = now.getTime();

        if (data.containsKey("type")) {
            switch (data.get("type")) {
                case "today_diss":
                    navigetToTodaysDisFragment(data);
                    break;
                case "questionnaire":
                    navigetToQuestionaire(data);
                    break;
                default:
                    navigateToHome();
                    break;
            }
        } else {
            navigateToHome();
        }



    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);


    NotificationCompat.Builder notificationBuilder;
    //Large Icon
    Bitmap remote_picture = null;
    try {
        if (data.containsKey("image")) {
            if (!data.get("image").isEmpty()) {
                remote_picture = BitmapFactory.decodeStream(
                        (InputStream) new URL(data.get("image")).getContent());

            }

        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    // this is a my insertion looking for a solution
    int icon = getNotificationIcon();
    if (data.containsKey("image") && remote_picture != null) {
        notificationBuilder = new NotificationCompat.Builder(this,"default")
                .setSmallIcon(icon)
                .setContentTitle(getResources().getString(R.string.app_name))
                .setStyle(new NotificationCompat.BigTextStyle().bigText(StringEscapeUtils.unescapeJava(data.get("message"))))
                .setContentText(StringEscapeUtils.unescapeJava(data.get("message")))
                .setAutoCancel(true)
                .setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary))
                .setContentIntent(pendingIntent)
                .setPriority(Notification.PRIORITY_MAX)
                .setLargeIcon(remote_picture)
                .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(remote_picture)
                        .setBigContentTitle(getString(R.string.app_name))
                        .setSummaryText(StringEscapeUtils.unescapeJava(data.get("message"))));
    } else {
        notificationBuilder = new NotificationCompat.Builder(this,"default")
                .setSmallIcon(icon)
                .setContentTitle(getResources().getString(R.string.app_name))
                .setStyle(new NotificationCompat.BigTextStyle().bigText(StringEscapeUtils.unescapeJava(data.get("message"))))
                .setContentText(StringEscapeUtils.unescapeJava(data.get("message")))
                .setAutoCancel(true)
                .setColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary))
                .setContentIntent(pendingIntent)
                .setPriority(Notification.PRIORITY_MAX);
    }


    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify((int) uniqueId, notificationBuilder.build());


}

如果您的通知包含可以显示在通知栏上的图像,这里我还为您提供管理丰富通知的解决方案

现在,如果您可以看到代码很平静

  case "today_diss":
                    navigetToTodaysDisFragment(data);
                    break;
                case "questionnaire":
                    navigetToQuestionaire(data);
                    break;
                default:
                    navigateToHome();
                    break;

这是您需要的主要解决方案,此方法也会将您重定向到您要重定向的屏幕,所以在这里我给您举个例子navigateToHome();

此方法会将您重定向到主屏幕

   private void navigateToHome() {
    Intent intentToEventPage = new Intent(MyFirebaseMessagingService.this, DashActivity.class);
    intentToEventPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intentToEventPage.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    pendingIntent = PendingIntent.getActivity(this, (int) uniqueId /* Request code */, intentToEventPage, PendingIntent.FLAG_ONE_SHOT);
}

这样,您可以pendingIntent根据您的要求修改以重定向到所需的活动或视图

于 2018-05-25T04:46:18.753 回答
0

您好@Tirumalesh kallepalli,您可以通过使用 FirebaseMessagingService 类中的 PendingIntent 来实现这一点

例子

    public class FcmListenerService extends FirebaseMessagingService {
    private String msg;
    NotificationHelper notificationHelper;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
    JSONObject object = null;
     try {
            Map<String, String> params = remoteMessage.getData();
            object = new JSONObject(params);
        } catch (Exception e) {

        }
        sendNotification(object);
  }

 private void sendNotification(JSONObject object) {

 //Here You can give your screen name whatever you want to open
 //Instead of HomeActivity.class you can replace your activity
        Intent intent = new Intent(this, HomeActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        try {
            msg = object.getString("message");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Uri defaultSoundUri = 
        RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new 
          NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_action_notification)
                .setContentTitle("Firebase Push Notification")
                .setContentText(msg)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());
}

只需在待定意图中给出活动的名称即可,我希望这会对您有所帮助。

于 2018-05-25T04:24:17.553 回答