确定是否通过FCM通知单击打开了活动

时间:2017-11-16 16:05:11

标签: android firebase-cloud-messaging

我正在使用fcm控制台向所有安装了我的应用的设备发送消息,通知只有通知消息没有任何额外的有效负载。

我想知道是否有一种简单的方法可以知道是否从FCM通知点击中打开了一个活动。

通过扩展FirebaseMessagingService服务并自行创建通知,有一个解决方案。

我想知道是否有其他解决方案没有扩展服务或将附加内容传递给通知。

是否有任何额外的Intent用于从通知点击中打开活动?

3 个答案:

答案 0 :(得分:7)

我希望您知道基于FCM的消息传递创建了两种类型的通知

首先,我们使用onMessageReceived()方法创建的通知,此处需要注意的是,如果应用位于前台,则会触发onMessageReceived()

其次,当app在后台时,FCM会创建自己的默认通知,在这种情况下,onMessageReceived()不会被截获,因此我们无法自行设置待处理的意图。

注意:当您向我的应用发送“通知”推送消息时,如果我发送“数据”消息onMessageReceived()被触发,则无论应用是什么,上述类型都会发挥作用在前台或后台(从FCM控制台发送的通知是“通知”类型推送消息)

回到你的问题,目前尚不清楚你是从FCM控制台发送推送消息还是发出FCM服务器请求,所以让我们在这里提出案例。

  1. FCM控制台发送的消息:
    从FCM上的通知面板中的advance部分发送数据有效负载,如下所示
  2. enter image description here

    当应用程序处于前台onMessageReceived()时,

    将被拦截 使用下面的代码来接收数据有效载荷

    public class MyFirebaseMessagingService extends FirebaseMessagingService {
    
    private static final String TAG = "MyFirebaseMsgService";
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //Displaying data in log
        //It is optional
    
    
        //Calling method to generate notification
        sendNotification(remoteMessage.getData());
    }
    
    //This method is only generating push notification
    //It is same as we did in earlier posts
    private void sendNotification(Map<String, String> messageBody) {
    
        Intent intent = new Intent(this, SplashScreen.class);
    
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(
                this,
                0,
                setNotificationRoute(messageBody),
                PendingIntent.FLAG_UPDATE_CURRENT);
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(android.R.drawable.sym_def_app_icon)
                .setContentTitle(messageBody.get("title"))
                .setContentText(messageBody.get("text"))
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);
    
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
        notificationManager.notify(0, notificationBuilder.build());
    
    
    }
    
    private Intent setNotificationRoute(Map<String, String> messageBody) {
        Intent intent = null;
        String type = messageBody.get("type");
        if (type != null) {
            switch (type) {
                case "android":    //intercept your payload here to create swit 
                    intent = new Intent(this, MainActivity.class);
                    break;
                default:
                    break;
    
            }
    
        }
        return intent;
    }
    }
    

    如果应用程序处于后台,则在通知单击应用程序将在“默认”活动上打开,您可以通过在活动的意图过滤器中的应用程序清单中添加以下行来将任何活动设置为默认活动: / p>

    <category android:name="android.intent.category.DEFAULT" />
    

    在此活动中,您可以调用以获取意图附加内容,然后获取数据有效负载以确定您需要登陆的活动。代码在

    之下
        .
        .
        .
    
            Bundle bundle = getIntent().getExtras();
                if (bundle != null) {
                    setNotificationRoute(getIntent().getExtras());
        .
        .
    }
     private void setNotificationRoute(Bundle extras) {
        String type = extras.getString("type");
        Intent intent = null;
        if (type != null) {
            switch (type) {
                case "message":
                    String room = extras.getString("room");
                    intent = new Intent(this, MainActivity.class);
                    startActivity(intent);
                    break;
                default:
                    break;
            }
          }
        }
    
    1. 从FCM服务器发送的消息:上面从FCM consolse发送的消息与将以下json正文作为发布请求发送到FCM服务器相同:

      { 
          "notification": {
          "title": "Hi Tester",
          "text": "News for testing",
          "sound": "default",
          "badge": 0
        },
        "data":{
          "type": "credits"
        },
        "priority": "high",
        "to": "{{device_token}}"
      }
      
    2. 对于这种情况,截取通知的过程将是相同的。

答案 1 :(得分:0)

如果要在不扩展FireBaseMessaging类的情况下启动任何活动,则可以使用FCM数据有效负载设置此标志。

因此,每当用户点击系统托盘上的FCM通知时,应该打开定义的活动。如果你想获得额外的捆绑数据,你可以使用getIntent()获取它.getExtras();方法

    "message":{
     "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
     "notification":{
       "title":"Match update",
       "body":"Arsenal goal in added time, score is now 3-0"
     },
"android":{
           "ttl":"86400s",
           "notification"{
             "click_action":"MainActivity.class" // define your activity here
           }
         },
 "payload": {
         "aps": {
           "category": "NEW_MESSAGE_CATEGORY"
         }
       }
     }

请参阅以下链接: -

"sets the appropriate keys to define the result of a user tap on the notification on Android and iOS — click_action, and category, respectively."

答案 2 :(得分:-1)

无需额外传递意图。只需设置标志

即可
  Intent lIntent = new Intent(getApplicationContext(),YourActivity.class);
        lIntent.addFlags(Intent.FLAG_ACTIVI`enter code here`TY_CLEAR_TOP);
        lIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
        lIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(lIntent);