Уведомление Android во время приложения в фоновом режиме, данные о намерениях пусты - PullRequest
0 голосов
/ 05 марта 2019

Я использую этот код, когда приложение находится на переднем плане, оно работает отлично.но уведомление, поступающее во время приложения, находится в фоновом режиме. Intent не содержит данных.

 Intent intent = new Intent(this, SplashActivity.class);

    intent.putExtra(Constant.device_id,deviceId);
    intent.putExtra(Constant.isFromPush,true);
    intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle(title_)
                    .setContentText(message)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

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

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId,
                getString(R.string.app_name),
                NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(channel);
    }

    notificationManager.notify(new Random().nextInt( 2000 ) /* ID of notification */, notificationBuilder.build());

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

У нас есть два типа полезной нагрузки в случае отправки-нисходящего потока, оба являются необязательными.

data

Этот параметр указывает пользовательские пары ключ-значение сообщенияполезная нагрузка.

уведомление

Этот параметр указывает предопределенные видимые пользователем пары ключ-значение полезной нагрузки уведомления.

[https://firebase.google.com/docs/cloud-messaging/http-server-ref#send-downstream][Find Подробнее здесь]

Когда вы находитесь в фоновом режиме, FCM будет отображать уведомление в системном трее на основе информации из полезной нагрузки уведомления.Заголовок, сообщение и значок, используемые для уведомления на панели задач, извлекаются из полезных данных уведомлений.

{
  "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification",
        "click_action" : "OPEN_ACTIVITY_1"
       }
}

Вам нужно использовать data payload вместо полезных данных уведомлений, ваша проблема полученарешен.

Вот пример JSON, который я получаю:

{
  "to": "FCM registration ID",

   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

Вот мой код Java.

@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        if (remoteMessage == null)
            return;

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {

            try {
                JSONObject json = new 
                JSONObject(remoteMessage.getData().toString());
                handleDataMessage(json);
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
    }

Сообщения с уведомлением иполезная нагрузка данных:

Сообщение также может содержать как уведомления, так и полезную нагрузку данных.Когда такие сообщения отправляются, они обрабатываются в двух сценариях, в зависимости от состояния приложения (фон / передний план).Для этих сообщений мы можем использовать как уведомления, так и ключи данных.

В фоновом режиме - приложения получают полезную нагрузку уведомлений в области уведомлений и обрабатывают полезную нагрузку данных только тогда, когда пользователь нажимает науведомление.

На переднем плане - приложение получает объект сообщения с обоими полезными нагрузками.

0 голосов
/ 05 марта 2019

Для обработки данных о намерениях, когда приложение находится в фоновом режиме, вам нужно сделать что-то дополнительное.В вашем ответе должен быть ключ «данные», чтобы активировать его.Например,

{
"notification": {
    "key_1": "value_1",
    "key_2": "value_2"
 },
"data": {
    "key_1": "value_1",
    "key_2": "value_2"
 },

}

И вам нужно получить значения внутри метода onCreate вашего запуска.Активность запуска заключается в том, что <intent-filter> содержит

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

Получать данные,

Bundle bundle = getIntent().getExtras();
if (bundle != null) {
   //bundle contains all info of "data" field of the notification
}

В фоновом режиме приложение получает полезную нагрузку уведомления в области уведомлений и обрабатывает полезную нагрузку данных только тогда, когдапользователь нажимает на уведомление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...