Android 在Firebase中应用程序处于后台时如何处理通知

Android 在Firebase中应用程序处于后台时如何处理通知,android,firebase,firebase-cloud-messaging,Android,Firebase,Firebase Cloud Messaging,这是我的舱单 <service android:name=".fcm.PshycoFirebaseMessagingServices"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <

这是我的舱单

    <service android:name=".fcm.PshycoFirebaseMessagingServices">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <service android:name=".fcm.PshycoFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

在后台应用程序中处理消息

当你的应用程序在后台时,Android会发出通知 将邮件发送到系统托盘。用户点击通知打开 默认情况下,应用程序启动器

这包括同时包含通知和数据的消息 有效载荷。在这些情况下,通知会发送到设备的 系统托盘,数据有效负载在 您的启动器活动的意图

如果要打开应用程序并执行特定操作,请设置 单击通知负载中的\u操作并将其映射到意图 筛选要启动的活动。例如,设置 单击\u操作打开\u活动\u 1以触发类似 以下:

您无法使用Firebase控制台设置单击操作负载。您可以尝试使用curl命令或自定义http服务器进行测试

curl --header "Authorization: key=<YOUR_KEY_GOES_HERE>" 
     --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send  
     -d "{\"to\":\"/topics/news\",\"notification\": 
         {\"title\": \"Click Action Message\",\"text\": \"Sample message\",
            \"click_action\":\"OPEN_ACTIVITY_1\"}}"
curl--header“Authorization:key=”
--标题内容类型:“应用程序/json”https://fcm.googleapis.com/fcm/send  
-d“{\”至\”:“/topics/news\”,“notification\”:
{\'title\':\'Click Action Message\',\'text\':\'Sample Message\',
\“单击\u action\”:\“打开\u活动\u 1\”}”
1。为什么会这样? FCM(Firebase云消息传递)中有两种类型的消息:

  • 显示消息:这些消息仅在应用程序位于前台时触发
    onMessageReceived()
    回调
  • 数据消息:如果您的应用程序位于前台/后台/死机中,这些消息会触发
    onMessageReceived()
    回调
  • 注意:Firebase团队尚未开发一个用户界面,用于向用户发送
    数据消息
    你的设备,还没有。您应该使用您的服务器发送此类型



    2.如何? 要实现这一点,您必须对以下URL执行
    POST
    请求:

    POST

    标题
    • 键:
      内容类型
      值:
      应用程序/json
    • 键:
      授权
      值:
      键=
    身体使用主题 或者如果您想将其发送到特定设备

    注意:确保您没有添加
    JSON密钥
    通知

    注意:要获取您的服务器密钥,您可以在firebase控制台中找到它:
    您的项目->设置->项目设置->云消息->服务器密钥

    3.如何处理推送通知消息? 以下是您处理收到的消息的方式:

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) { 
         Map<String, String> data = remoteMessage.getData();
         String myCustomKey = data.get("my_custom_key");
    
         // Manage data
    }
    
    @覆盖
    收到的消息(RemoteMessage RemoteMessage)上的公共无效{
    Map data=remoteMessage.getData();
    字符串myCustomKey=data.get(“my_custom_key”);
    //管理数据
    }
    
    使firebase库在以下情况下调用您的onMessageReceived()

  • 前台应用程序
  • 后台应用程序
  • 应用程序已被删除
  • 您不能将JSON键“通知”放在对firebase API的请求中,而应使用“数据”,见下文

    当您的应用程序处于后台或被终止时,以下消息将不会调用您的onMessageReceived(),并且您无法自定义通知

    {
       "to": "/topics/journal",
       "notification": {
           "title" : "title",
           "text": "data!",
           "icon": "ic_notification"
        }
    }
    
    但是,使用它会起作用

    {
      "to": "/topics/dev_journal",
       "data": {
           "text":"text",
           "title":"",
           "line1":"Journal",
           "line2":"刊物"
       }
    } 
    
    基本上,消息在参数RemoteMessage中作为映射与数据对象一起发送,然后您可以在onMessageReceived中管理通知,如这里的代码段所示

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) { 
         Map<String, String> data = remoteMessage.getData();
    
         //you can get your text message here.
         String text= data.get("text");
    
    
         NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            // optional, this is to make beautiful icon
                 .setLargeIcon(BitmapFactory.decodeResource(
                                        getResources(), R.mipmap.ic_launcher))  
            .setSmallIcon(smallIcon)  //mandatory
          .......
        /*You can read more on notification here:
        https://developer.android.com/training/notify-user/build-notification.html
        https://www.youtube.com/watch?v=-iog_fmm6mE
        */
    }
    
    @覆盖
    收到的消息(RemoteMessage RemoteMessage)上的公共无效{
    Map data=remoteMessage.getData();
    //你可以在这里收到你的短信。
    String text=data.get(“text”);
    NotificationCompat.Builder notificationBuilder=新建NotificationCompat.Builder(此)
    //可选,这是为了制作漂亮的图标
    .setLargeIcon(BitmapFactory.decodeResource(
    getResources(),R.mipmap.ic_启动器)
    .setSmallIcon(smallIcon)//必须
    .......
    /*您可以在此处阅读有关通知的更多信息:
    https://developer.android.com/training/notify-user/build-notification.html
    https://www.youtube.com/watch?v=-iog_fmm6mE
    */
    }
    
    根据中的firebase文档,有两种类型的有效载荷:

  • 数据

    此参数指定消息有效负载的自定义键值对。 客户端应用程序负责处理数据消息。数据消息只有自定义键值对

  • 通知

    此参数指定通知有效负载的预定义的、用户可见的键值对。FCM代表客户端应用程序自动向最终用户设备显示消息。通知消息具有一组预定义的用户可见键

  • 当您在前台时,您可以使用onMessageReceived()获取FCM内部的数据,您可以从数据有效负载获取数据

    data = remoteMessage.getData();
    String customData = (String) data.get("customData");
    
    {
      "notification": {
            "title" : "title",
            "body"  : "body text",
            "icon"  : "ic_notification",
            "click_action" : "OPEN_ACTIVITY_1"
           }
    }
    
    当您在后台时,FCM将根据通知有效负载中的信息在系统托盘中显示通知。用于系统托盘上通知的标题、消息和图标来自通知有效负载

    data = remoteMessage.getData();
    String customData = (String) data.get("customData");
    
    {
      "notification": {
            "title" : "title",
            "body"  : "body text",
            "icon"  : "ic_notification",
            "click_action" : "OPEN_ACTIVITY_1"
           }
    }
    
    当您希望在后台应用程序时在系统托盘上自动显示通知时,将使用此通知有效负载。 要在应用程序处于后台时获取通知数据,您应该在通知负载中添加单击操作

    data = remoteMessage.getData();
    String customData = (String) data.get("customData");
    
    {
      "notification": {
            "title" : "title",
            "body"  : "body text",
            "icon"  : "ic_notification",
            "click_action" : "OPEN_ACTIVITY_1"
           }
    }
    
    如果您想[在后台]打开应用程序并执行特定操作,请在通知负载中设置click_action,并将其映射到Activ中的意图过滤器
    <intent-filter>
      <action android:name="OPEN_ACTIVITY_1" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    
    Bundle b = getIntent().getExtras();
    String someData = b.getString("someData");
    
    {
      "to": "FCM registration ID",
      "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification",
        "click_action" : "OPEN_ACTIVITY_1"
       },
       "data": {
         "someData"  : "This is some data",
         "someData2" : "etc"
       }
    }
    
    import android.content.Context
    import android.content.Intent
    import android.util.Log
    import androidx.legacy.content.WakefulBroadcastReceiver
    import com.google.firebase.messaging.RemoteMessage
    
    class FirebaseBroadcastReceiver : WakefulBroadcastReceiver() {
    
        val TAG: String = FirebaseBroadcastReceiver::class.java.simpleName
    
        override fun onReceive(context: Context, intent: Intent) {
    
            val dataBundle = intent.extras
            if (dataBundle != null)
                for (key in dataBundle.keySet()) {
                    Log.d(TAG, "dataBundle: " + key + " : " + dataBundle.get(key))
                }
            val remoteMessage = RemoteMessage(dataBundle)
            }
        }
    
    <receiver
          android:name="MY_PACKAGE_NAME.FirebaseBroadcastReceiver"
          android:exported="true"
          android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
    </receiver>
    
    {
      "data":{
        "id": 1,
        "missedRequests": 5
        "addAnyDataHere": 123
      },
      "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
    }
    
    Object obj = message.getData().get("id");
            if (obj != null) {
                int id = Integer.valueOf(obj.toString());
            }
    
    onMessageReceived()
    
    onMessageReceived()
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState, R.layout.activity_splash);
    
        if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) {
    
            // do what you want
    
            // and this for killing app if we dont want to start
            android.os.Process.killProcess(android.os.Process.myPid());
    
        } else {
    
            //continue to app
        }
    }
    
    android.os.Process.killProcess(android.os.Process.myPid());
    
    { "data": {
        "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg",
        "message": "Firebase Push Message Using API"
        "AnotherActivity": "True"
         },
      "to" : "device id Or Device token"
    }
    
    {
        "to" : "/topics/topic_name",
        "data": {
        "key1" : "value1",
        "key2" : "value2",
        }
    }
    
    {
        "registration_ids" : "[{"id"},{id1}]",
        "data": {
        "key1" : "value1",
        "key2" : "value2",
         }
    }
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) { 
         Map<String, String> data = remoteMessage.getData();
         String value1 = data.get("key1");
         String value2 = data.get("key2");
    }
    
    <activity android:name=".MainActivity">
          <intent-filter>
               <action android:name=".MainActivity" />
               <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
    </activity>
    
    { 
     "notification" : {
            "click_action" : ".MainActivity", 
            "body" : "new Symulti update !", 
            "title" : "new Symulti update !", 
            "icon" : "ic_notif_symulti" }, 
     "data": { ... },
     "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }
    
    "click_action" : ".MainActivity"
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //get notification data info
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
           //bundle must contain all info sent in "data" field of the notification
        }
    }
    
    {
      "to": "FCM registration ID",
      "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification"
       },
       "data": {
         "someData"  : "This is some data",
         "someData2" : "etc"
       }
    }
    
    <activity android:name=".MainActivity">
            <intent-filter>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </activity>
    
    Intent intent = getIntent();
    if (intent != null && intent.getExtras() != null) {
        Bundle extras = intent.getExtras();
        String someData= extras.getString("someData");
        String someData2 = extras.getString("someData2");
    }
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
    
    }
    
    compile 'com.google.firebase:firebase-messaging:10.2.1'
    
    @Override
    public void handleIntent(Intent intent) {
        super.handleIntent(intent);
    
        // you can get ur data here 
        //intent.getExtras().get("your_data_key") 
    
    
    }
    
    if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
    String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();
    
    {
        "notification": {
            "body": "Cool offers. Get them before expiring!",
            "title": "Flat 80% discount",
            "icon": "appicon",
            "click_action": "activity name" //optional if required.....
        },
        "data": {
            "product_id": 11,
            "product_details": "details.....",
            "other_info": "......."
        }
    }
    
    "data": {
        "user_name": "arefin sajib",
        "value": "user name notification"
      }
    
        if(getIntent()!=null){
                Bundle bundle = getIntent().getExtras();
                if (bundle != null) {
                    try {
                       JSONObject object = new JSONObject(bundle.getStringExtra("data"));
    String user_name = object.optString("user_name");
    
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
    
    
                }
            }
    
     dependencies {
            compile 'com.google.firebase:firebase-core:11.2.0'
            compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0'
        }
    
    @WorkerThread
    public void onMessageReceived(RemoteMessage var1) {
      //your app is in background or foreground all time calling
    }
    
    <?php
    $url = "https://fcm.googleapis.com/fcm/send";
    $token = "C-l6T_a7HouUK****";
    $serverKey = "AAAAaOcKS00:********";
    define( 'API_ACCESS_KEY', $serverKey );
    $registrationIds = array($token);
    // prep the bundle
    
    $msg = array
    
    (
     'message'  => 'here is a message. message',
     'title'        => 'This is a title. title',
     'subtitle' => 'This is a subtitle. subtitle',
     'tickerText'   => 'Ticker text here...Ticker text here...Ticker text 
     here',
     'vibrate'  => 1,
     'sound'        => 1,
     'largeIcon'    => 'large_icon',
     'smallIcon'    => 'small_icon'
    
    );
    
    $fields = array
    
    (
      'registration_ids'    => $registrationIds,
      'data'            => $msg
    
    );
    $headers = array
    
    (
      'Authorization: key=' . API_ACCESS_KEY,
     'Content-Type: application/json'
    
    );
    
    
    $ch = curl_init();
    
    curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' 
    );
    
    curl_setopt( $ch,CURLOPT_POST, true );
    
    curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
    
    curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
    
    curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
    
    curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
    
    $result = curl_exec($ch );
    
    curl_close( $ch );
    
    echo $result;
    
    ?>
    
    public class MyFirebaseMessagingService extends FirebaseMessagingService     {
    
      private static final String TAG = "MyFirebaseMsgService";
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.d(TAG, "From: " + remoteMessage.getFrom());
    
        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    
          sendNotification(remoteMessage.getData().get("message"));
         }
       // Check if message contains a notification payload.
        else if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        sendNotification(remoteMessage.getNotification().getBody());
        }
    
    
    }
       private void sendNotification(String messageBody) {
        Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);
    
        String channelId = "idddd";
        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(MyFirebaseMessagingService.this)
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentTitle("FCM Message")
                        .setContentText(messageBody)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
    
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
    }
    
    const message = {
        token: token_id,   // obtain device token id by querying data in firebase
        data: {
           title: "my_custom_title",
           body:  "my_custom_body_message"
           }
        }
    
    
    return admin.messaging().send(message).then(response => {
        // handle response
    });
    
    if (data != null) {
      Log.d(TAG, "data title is: " + data.get("title");
      Log.d(TAG, "data body is: " + data.get("body");
    }
    
    // build notification using the body, title, and whatever else you want.
    
    //Data should come in this format from the notification
    {
      "to": "/xyz/Notifications",
      "data": {
          "key1": "title notification",
          "key2": "description notification"
      }
    }
    
      @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            super.onMessageReceived(remoteMessage);
          String key1Data = remoteMessage.getData().get("key1");
          // use key1Data to according to your need
        }
    
    "data":    "image": "",    "message": "Firebase Push Message Using API", 
    
      public void onMessageReceived(RemoteMessage remoteMessage)
        if (remoteMessage.getData().size() > 0) 
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());      
    
    POST: https://fcm.googleapis.com/v1/projects/YOUR_FIREBASEDB_ID/messages:send
    
    Key: Content-Type, Value: application/json
    
    Bearer YOUR_TOKEN 
    
    {
       "message":{
        "topic" : "xxx",
        "data" : {
             "body" : "This is a Firebase Cloud Messaging Topic Message!",
             "title" : "FCM Message"
              }
          }
     }
    
    var PROJECT_ID = 'YOUR_PROJECT_ID';
    var HOST = 'fcm.googleapis.com';
    var PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
    var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
    var SCOPES = [MESSAGING_SCOPE];
    
      router.get('/', function(req, res, next) {
          res.render('index', { title: 'Express' });
          getAccessToken().then(function(accessToken) {
            console.log("TOKEN: "+accessToken)
          })
    
        });
    
    function getAccessToken() {
    return new Promise(function(resolve, reject) {
        var key = require('./YOUR_DOWNLOADED_JSON_FILE.json');
        var jwtClient = new google.auth.JWT(
            key.client_email,
            null,
            key.private_key,
            SCOPES,
            null
        );
        jwtClient.authorize(function(err, tokens) {
            if (err) {
                reject(err);
                return;
            }
            resolve(tokens.access_token);
        });
    });
    }
    
    @Override
    public void onNewToken(String token) {
        Log.d(TAG, "Refreshed token: " + token);
    
    }
    
    <service android:name=".service.MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
    
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_notification" />
    
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorAccent" />
    
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/push_channel" />
    
     "data": {
    "message": "2",
    "title": "1",
    "pushType" : "banner",
    "bannerLink": "http://www.google.com",
    "image" : "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}
    
            Bundle extras = intent.getExtras();
            String bannerLink = extras.getString("bannerLink");
            ...
            String channelId = extras.getString("channelId");
    
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:screenOrientation="portrait"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name=".MainActivity" />
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    
    Intent i = getIntent();
    Bundle extras = i.getExtras();
    if (extras != null) {
        for (String key : extras.keySet()) {
            Object value = extras.get(key);
            Log.d(Application.APPTAG, "Extras received at onCreate:  Key: " + key + " Value: " + value);
        }
        String title = extras.getString("title");
        String message = extras.getString("body");
        if (message!=null && message.length()>0) {
            getIntent().removeExtra("body");
            showNotificationInADialog(title, message);
        }
    }
    
    @Override
    public void onNewIntent(Intent intent){
        //called when a new intent for this class is created.
        // The main case is when the app was in background, a notification arrives to the tray, and the user touches the notification
    
        super.onNewIntent(intent);
    
        Log.d(Application.APPTAG, "onNewIntent - starting");
        Bundle extras = intent.getExtras();
        if (extras != null) {
            for (String key : extras.keySet()) {
                Object value = extras.get(key);
                Log.d(Application.APPTAG, "Extras received at onNewIntent:  Key: " + key + " Value: " + value);
            }
            String title = extras.getString("title");
            String message = extras.getString("body");
            if (message!=null && message.length()>0) {
                getIntent().removeExtra("body");
                showNotificationInADialog(title, message);
            }
        }
    }
    
    
    private void showNotificationInADialog(String title, String message) {
    
        // show a dialog with the provided title and message
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(title);
        builder.setMessage(message);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }
    
    package com.yourcompany.app;
    
    import android.content.Intent;
    import android.util.Log;
    
    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    public class MyFirebaseMessagingService extends FirebaseMessagingService {
    
    
        public MyFirebaseMessagingService() {
            super();
        }
    
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
    
            Log.d(Application.APPTAG, "myFirebaseMessagingService - onMessageReceived - message: " + remoteMessage);
    
            Intent dialogIntent = new Intent(this, NotificationActivity.class);
            dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            dialogIntent.putExtra("msg", remoteMessage);
            startActivity(dialogIntent);
    
        }
    
    }
    
    package com.yourcompany.app;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.util.Log;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.appcompat.view.ContextThemeWrapper;
    
    import com.google.firebase.messaging.RemoteMessage;
    
    public class NotificationActivity extends AppCompatActivity {
    
    private Activity context;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        Bundle extras = getIntent().getExtras();
    
        Log.d(Application.APPTAG, "NotificationActivity - onCreate - extras: " + extras);
    
        if (extras == null) {
            context.finish();
            return;
        }
    
        RemoteMessage msg = (RemoteMessage) extras.get("msg");
    
        if (msg == null) {
            context.finish();
            return;
        }
    
        RemoteMessage.Notification notification = msg.getNotification();
    
        if (notification == null) {
            context.finish();
            return;
        }
    
        String dialogMessage;
        try {
            dialogMessage = notification.getBody();
        } catch (Exception e){
            context.finish();
            return;
        }
        String dialogTitle = notification.getTitle();
        if (dialogTitle == null || dialogTitle.length() == 0) {
            dialogTitle = "";
        }
    
        AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
        builder.setTitle(dialogTitle);
        builder.setMessage(dialogMessage);
        builder.setPositiveButton(getResources().getString(R.string.accept), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    
    }
    
        <service
            android:name=".MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    
        <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id"/>
    
        <activity android:name=".NotificationActivity"
            android:theme="@style/myDialog"> </activity>
    
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/notification_icon"/>
    
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/color_accent" />
    
          // notifications channel creation
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          // Create channel to show notifications.
          String channelId = getResources().getString("default_channel_id");
          String channelName = getResources().getString("General announcements");
          NotificationManager notificationManager = getSystemService(NotificationManager.class);
          notificationManager.createNotificationChannel(new NotificationChannel(channelId,
                  channelName, NotificationManager.IMPORTANCE_LOW));
      }
    
    { 
      "to": "/path", 
      "data": 
         { 
          "my_custom_key": "my_custom_value", 
          "my_custom_key2": true 
         } 
    }
    
     {
         "notification": {
                "title" : "title",
                "body"  : "body text",
                "icon"  : "ic_notification",
                "click_action" : "OPEN_ACTIVITY_1"
            }
       }
    
    public class MyFirebaseMessagingService extends FirebaseMessagingService {
        …
    
          @Override public void onMessageReceived(RemoteMessage remoteMessage){
               Map<String, String> data = remoteMessage.getData();
               String myCustomKey = data.get("my_custom_key");
            
           } 
    
        …
    
    }