为什么onMessageReceived()方法在应用程序处于后台时没有正确传递意图?

时间:2018-04-18 14:22:05

标签: android firebase firebase-cloud-messaging android-pendingintent

实际上,我正在尝试通过点击activity将意图传递给push-notification,当应用程序出现在foreground时,它正常工作。但是当应用程序处于后台时虽然我收到push-notification但没有任何问题,但是通过点击该通知我没有意图activity。我尝试在SO中引用一些问题并尝试添加PendingIntent.FLAG_UPDATE_CURRENT之类的标记, PendingIntent.FLAG_ONE_SHOT,然后是意图(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP ),但没有一个是有用的。请帮助我解决这个问题,这是过去两天的痛苦。

的Manifest.xml:

<activity android:name=".activities.ProfileHolder"
        android:windowSoftInputMode="adjustPan"
        android:screenOrientation="portrait"
        android:exported="true"
        android:launchMode="singleTop"
       >
        <intent-filter>
            <action android:name="profile" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

Node.js中的通知代码:

var message = {
         to: u.fcm_token, 
         collapse_key: 'white', //anything can be given
         data: {
             type:"likes",
             post_owner_username:data.like_post_owner_username,
             owner_post_time:data.like_post_owner_time

         },
         priority: 'high',
         notification: {
             title: 'Infinity',
             body:notif_data,
             sound: "default",
             click_action: "profile",
             tag:"Hey Bro" //if specified then current msg would be  replaced by new msg
         }
     };

     fcm.send(message, function(err, response){
         if (err) {
             console.log(err);
         } else {
             console.log("Successfully sent with response: ", response);
         }
     });

FirebaseMessagingService类:

/Varibales for notifications
String title, body, post_owner_username, post_owner_time, notif_commenter_username, notif_comment_time, follower_username,messager_username,type,action;
@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {
    title=remoteMessage.getNotification().getTitle();
    body=remoteMessage.getNotification().getBody();
    type=remoteMessage.getData().get("type");
    action=remoteMessage.getNotification().getClickAction();

    Log.d("type",type);
    Log.d("type-2",title);

   if(type.equals("likes")){
       post_owner_username=remoteMessage.getData().get("post_owner_username");
       post_owner_time=remoteMessage.getData().get("owner_post_time");
   }
   else if(type.equals("comments")||type.equals("comment_likes")){
       post_owner_username=remoteMessage.getData().get("post_owner_username");
       post_owner_time=remoteMessage.getData().get("owner_post_time");
       notif_commenter_username=remoteMessage.getData().get("commenter_username");
       notif_comment_time=remoteMessage.getData().get("comment_time");
   }
   else if(type.equals("follow")){
       follower_username=remoteMessage.getData().get("follower_username");
   }
   else if(type.equals("messaging")){
       messager_username=remoteMessage.getData().get("sender_username");
   }

    //Showing Notification

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(getApplicationContext(), Constants.CHANNEL_ID)
                    .setSmallIcon(R.drawable.new_icon)
                    .setContentTitle(title)
                    .setContentText(body);

    Intent i = new Intent(action);
    Bundle b = new Bundle();
    if (type.equals("likes")) {
        b.putString("post_owner_username", post_owner_username);
        b.putString("post_owner_time", post_owner_time);
        b.putString("what", "show_notification_post");
        b.putString("Open","starred");

        // i.putExtra("Open", "starred");
    }
    else if (type.equals("comments")) {
        b.putString("post_owner_username",post_owner_username);
        b.putString("post_owner_time", post_owner_time);
        b.putString("notif_commenter_username", notif_commenter_username);
        b.putString("notif_comment_time",notif_comment_time);
        b.putString("what", "show_notification_post");
        b.putString("Open","starred");
        //i.putExtra("Open", "starred");
    }
    else if (type.equals("comment_likes")) {

        b.putString("post_owner_username", post_owner_username);
        b.putString("post_owner_time", post_owner_time);
        b.putString("notif_commenter_username", notif_commenter_username);
        b.putString("notif_comment_time", notif_comment_time);
        b.putString("what", "show_notification_post");
        b.putString("Open","starred");
        // i.putExtra("Open", "starred");
    }
    else if (type.equals("follow")||type.equals("follow_request")) {
        b.putString("searchUsername", follower_username);
        b.putString("Open","search_profile");
        //i.putExtra("Open", "search_profile");
    }
    else if(type.equals("messaging")){
        b.putString("Open","messaging");
        b.putString("msg_username",messager_username);
    }

    i.putExtras(b);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP );
    //ctx.startActivity(i);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);

    /*
     *  Setting the pending intent to notification builder
     * */

    mBuilder.setContentIntent(pendingIntent);

    NotificationManager mNotifyMgr =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);


    if (mNotifyMgr != null) {
        mBuilder.setAutoCancel(true);
        mNotifyMgr.notify(1, mBuilder.build());
    }
}

1 个答案:

答案 0 :(得分:2)

我认为问题是因为您正在从fcm控制台发送通知!

来自文档

  

“当您的应用在用户设备的后台时,通知   被送到系统托盘。当用户点击时   通知,应用启动器会打开您的应用。如果你愿意,你可以   还添加客户端消息处理以在您的应用程序中接收通知   当它已经在用户设备的前台时。“

您应该尝试使用Fcm apis发送通知

<强>假设 我认为你使用api时不应该发送通知参数只发送数据参数并解析onMessageReceived中的数据如果你发送通知它会传递到系统托盘

How to handle notification when app in background in Firebase