#android #android-intent #firebase #firebase-notifications
#Android #android-намерение #firebase #firebase-уведомления
Вопрос:
EDIT3: Хорошо, я нашел проблему: если приложение убито, отправка обоих data
и notification
не сработает onMessageReceived
. notification
должно быть установлено значение null, если целевым устройством является Android.
Это действительно глупое поведение.
Оригинальное сообщение:
Я могу успешно извлечь пакет из намерения, переданного notificationBuilder
в действие при запуске приложения.
Однако, если я убью приложение, уведомление все равно будет работать, но значение GetExtras()
из намерения равно нулю.
В моем FirebaseMessagingService
дочернем классе:
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
{
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("key_1","value");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//also tried with PendingIntent.FLAG_CANCEL_CURRENT
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("title")
.setContentText("messageBody")
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
Когда приложение убито, firebaseMessagingService
оно даже не может записать файл. Он не падает, он строит и показывает уведомление, но все, что делается с диском, не работает.
РЕДАКТИРОВАТЬ: я заменил содержимое onMessageReceived
метода следующим образом:
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
{
// Do nothing
}
Когда приложение запущено, ничего не происходит — как и ожидалось, — но когда приложение отключается, отображается уведомление с именем app в качестве заголовка и remoteMessage.getNotification().getBody()
в виде текста содержимого.
Кажется, что onMessageReceived
это не сработало. Вместо этого вызывается другая волшебная функция…
EDIT2: в соответствии с запросом, это то, что отправляется с сервера:
{
"data":
{
"form_id":"33882606580812",
"recipientUserId":10500
}
,
"to":"e0bU2jIVO9g:APA91bHsS-s3G1gQLcTFtRUC77pJUWcZvD7h9NfUgFLD-bFam1S0dddngVcmrQlXR5i6DfTsc69T8JbIrSuzyF1iv0c4ac1gmkwvGVMwZo_yA4KwOh82Nx-weYeL79r79si4qH3QBEgs",
"notification":
{
"body":"you have a new notification",
"badge":"1",
"sound":"default"
},
"delay_while_idle":false
}
Комментарии:
1. Пожалуйста, можете ли вы поделиться JSON вашего fcm, который вы используете для отправки данных и уведомлений?
2. Также вы помещаете весь этот код сюда?
// Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " remoteMessage.getData()); //and your other code i.e intents and all }
3. Можете ли вы сказать мне производителя или модель телефона, на котором вы это тестируете. Поскольку многие производители (особенно те, которые базируются в Китае) имеют в своей архитектуре странные приложения для уничтожения фоновых служб, которые вызывают множество проблем с фоновыми приложениями служб и многим другим. Просто небольшое беспокойство, что даже это может быть проблемой здесь.
4. Возможно, вы правы, я тестирую с помощью эмуляторов Visual Studio. Я собираюсь протестировать на реальном устройстве.
5. Повторяя первый комментарий, не могли бы вы расширить вопрос полезной нагрузкой, которую вы отправляете в FCM? Это действительно важно, поскольку клиент Android ведет себя по-разному в зависимости от того, какие типы полезной нагрузки (данные и / или уведомления) вы включаете.
Ответ №1:
После вашего второго редактирования мы видим, что вы отправляете как notification
полезную нагрузку, так и data
полезную нагрузку в FCM. Если вы проверите документацию FCM, вы можете увидеть, как приложение будет вести себя в зависимости от того, находится ли оно на переднем плане или в фоновом режиме. (Завершение работы вашего приложения — это то же самое, что и работа в фоновом режиме.)
[Исключение 2] Сообщения с уведомлением и полезной нагрузкой данных, как фоновые, так и на переднем плане.В этом случае уведомление доставляется в системный трей устройства, а полезная нагрузка данных доставляется в дополнение к намерению вашей активности запуска.
Это означает, что ваш onMessageReceived
метод никогда не вызывается в этом состоянии. Служба FCM внутренне создает уведомление, которое запускает ваше основное действие и автоматически передает полезную data
нагрузку в intent bundle.
Вы должны либо правильно обработать эту ситуацию, либо использовать только data
полезные нагрузки, чтобы отказаться от встроенного поведения.
Ответ №2:
Мой первый ответ на ваш вопрос, который я в итоге удалил, поскольку мы оба чувствовали, что в вашем случае вызывается onMessageReceived() . Но это то, что есть на самом деле
Метод onMessageReceived() не будет вызываться, если приложение находится в фоновом режиме или отключено, и если отправленное сообщение содержит ДАННЫЕ и полезную нагрузку УВЕДОМЛЕНИЯ.
Когда приложение не запущено, вы все равно получите уведомление. Но если вы хотите перехватывать данные через onMessageReceived(), вам придется создать пользовательский сервер приложений, который будет отправлять только полезную нагрузку данных в конечную точку fcm.
что-то вроде этого:
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data" : {
"Title" : "Title for Notification",
"body" : "Notification body can go here",
"Room" : "Something extra"
},
}
Надеюсь, это решит вашу проблему.
РЕДАКТИРОВАТЬ: я только что понял, что если вы хотите отправлять уведомления и полезную нагрузку данных как во время отключения приложения, так и в фоновом режиме, то намерение может быть перехвачено в активности запуска , когда пользователь нажимает на уведомление. Просто выполнив это:
Intent fcmIntent = getIntent();
Но это будет работать только в пусковой установке, которую запускает щелчок уведомления. Вы можете просто поместить его в метод onCreate().
Комментарии:
1. Спасибо за действительно важную информацию, я обнаружил, что нет необходимости использовать ее в пусковой установке. внутри службы firebase вы отправляете эти данные в определенное намерение. там вы можете использовать, но действительно важно, если вы добавляете полезную нагрузку уведомления. он не просыпается и не делает то, что вам нужно. работают только данные