Приложение Android не получает уведомление Firebase, когда приложение остановлено из лотка с несколькими задачами

Я прочитал аналогичный вопрос о SO, однако, я не смог получить от него правильный ответ.

У меня есть система, в которой мы отправляем уведомление примерно на 500 устройств. К сожалению, многие из этих устройств не получают уведомление. Я обнаружил, что телефоны серии OPPO F1 особенно не получают уведомление.

Я заметил, что это происходит, если приложение остановлено из лотка с несколькими задачами. Как это разрешить?

[Обновление: я заметил, что когда я закрываю приложение из панели задач, мое приложение принудительно останавливается в диспетчере приложений. Когда я закрываю Whatsapp из панели задач, он все равно не принудительно останавливается. Как это обрабатывается Whatsapp?]

Solutions Collecting From Web of "Приложение Android не получает уведомление Firebase, когда приложение остановлено из лотка с несколькими задачами"

Обновление 03/2017 – Включая часть моего ответа здесь .

В отношении темы, касающейся разводки закрытых / убитых / сил , эта тема обсуждалась довольно давно и, похоже, нет определенного ответа. Во время одного из моих тестов я все еще могу получить сообщение (проверено с помощью полезной нагрузки только для data ), если я закрою свое приложение. Но когда я принудительно закрыл его из меню «Настройки», я не смог получить никаких сообщений . Обратите внимание, что это не всегда поведение.

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

Существуют также устройства, в которых даже если приложение все еще просто просто удалено , хотя он не закрыт , само устройство мешает ему получать сообщения. Другие говорят, что это не может быть так, потому что такие приложения, как WhatsApp, смогли это сделать. Причина, по которой я узнал до сих пор, заключается в том, что производители устройств внедрили большинство известных приложений для этого.

Это не документировано нигде, потому что (IMO), это тема, которая также зависит от устройства и что FCM не имеет полного контроля .


Оригинальный ответ:

Поскольку это специфичный для устройства ( как вы упомянули в своем номере: телефоны серии OPPO F1 ), вполне возможно, что когда приложение будет остановлено из лотка с несколькими задачами на этом устройстве, оно фактически убивает приложение, вызывая услуги и Другие связанные с ним фоновые процессы также могут быть уничтожены. См. Этот ответ, чтобы немного больше узнать о том, что я пытаюсь сказать.

Если вы ищете вокруг сообщества, то, что обычно предлагается здесь, это использовать флаг START_STICKY . Тем не менее, я видел, что ранее упоминалось о FirebaseMessagingService (см. Этот пост , комментарий от @ArthurThompson):

Эти службы будут запускаться службами Google Play, которые всегда работают на устройстве. Вам не нужно и не следует начинать / останавливать эти услуги самостоятельно.

С учетом сказанного существует также возможность (опять же из комментариев):

На устройстве может быть настройка, которая разрешает / запрещает это.


Я предлагаю провести дальнейшее тестирование, если службы будут убиты самим устройством или посмотреть, есть ли настройки, блокирующие уведомления.

Вы пытались использовать атрибут stopWithTask в своем классе обслуживания?

 <service android:name="com.yourapp.YourPushService" android:stopWithTask="false" /> 

Если установлено значение true, эта служба автоматически останавливается, когда пользователь удаляет задачу, внедренную в действие, принадлежащее приложению. Значение по умолчанию – false.

Если флаг имеет значение false, в вашем классе Service есть onTaskRemoved вызов onTaskRemoved .

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

Я прошел через то же самое, но в моем случае это были телефоны Xiaomi вместо телефонов Oppo. На самом деле происходит то, что при закрытии приложения из системного трея система полностью уничтожает приложение. Это означает, что ваше приложение не сможет получать уведомления через GCM / FCM. Разрешение WAKE_LOCK тоже не помогает.

Это НЕ означает, что телефон не получает уведомление. Это. Это просто не позволит приложениям показывать это. Вы можете проверить это, отправив трансляцию из adb и посмотрев на ваш логарифм.

Одним из возможных решений этой проблемы является использование SyncAdapter . Хотя это НЕ рекомендуется, я видел, как некоторые приложения используют его. Другими возможными решениями являются использование какой-либо фоновой службы, которая всегда работает. Некоторые люди также используют AlarmManager поскольку его почти никогда не убивают. Моя точка зрения – вы не можете полагаться на GCM / FCM для своих уведомлений.

Давайте поговорим о WhatsApp сейчас –

В телефонах Xiaomi они используют белый список или черный список приложений, основанных на определенных критериях. Если вы загружаете приложение, и если оно находится в белом списке, они разрешают приложению показывать уведомления. Если нет, вы уже знаете, что происходит. Но хорошо, что вы можете изменить эти настройки. Найдите приложение под названием «Безопасность». Если вы отмените правильные разрешения, даже WhatsApp перестанет показывать уведомления.

Я также столкнулся с одной и той же проблемой. Но потом я понял, что после много отладки я остановил службы, которые получают уведомления Firebase в методе stop одного из действий.

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

Ответ был найден здесь

Невозможно отправить сообщение данных из консоли уведомлений.

Но есть и другой способ отправки уведомлений на устройства, и они будут улавливаться внутри onMessageReceived!

Вы можете использовать терминал (Mac или Linux) или какую-либо услугу, например Postman, для отправки запроса на отправку по этой ссылке: https://fcm.googleapis.com/fcm/send

Со следующим телом:

 { "to": "/topics/your_topic_here", "data": { "text":"text", "text1":"text1", ... } } 

Также вам нужно добавить 2 заголовка:

  1. Авторизация – key = your_server_key_here
  2. Content-Type – application / json

Чтобы получить ключ сервера, вы можете найти его в консоли firebase: ваш проект -> настройки -> настройки проекта -> облачные сообщения -> ключ сервера

Введите описание изображения здесь

Введите описание изображения здесь

Когда приложение закрыто, он отключает службу. Необходимо перезапустить службу. См. Здесь

Я попытался переопределить значок уведомления, используя теги метаданных. Это сработало для меня.

 <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@mipmap/ic_launcher" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorPrimary" />