Уведомление Android с FCM - Кто начал службу FirebaseMessagingService?

В соответствии с инструкцией по настройке здесь, в примерном приложении, A) я создал класс, который extends класс услуг firebase. B) Я помещал эти классы в AndroidManifest.xml

A) Класс Java

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //a) What the life cycle of the service? How can I ensure this method is getting called?
        //b) If the service is killed at some point, will system restart it on receiving new messages?
        Log.d(TAG, "From: " + remoteMessage.getFrom());
    }
}

B) AndroidManifest.xml

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

Затем приложение может получать уведомления от FCM!

Вот мой вопрос:

  • Кто начал службу уведомления FirebaseMessagingService? Должно быть какое-то место, вызывающее startService(), не так ли?

  • Я понимаю, что уведомление о нисходящем потоке будет доставляться на мое мобильное устройство google play, независимо от состояния моего приложения. Затем, насколько я могу гарантировать, что мой onMessageReceive() вызывается, когда app или service есть swipe closed/killed/force stop? Является ли соответствующее поведение документированным где угодно?

ИЗМЕНИТЬ:

  1. Меня больше беспокоит следующий случай. Расскажите о data message. (по сравнению с notification message.) Мое клиентское приложение получило сообщение FCM и отобразило уведомление по умолчанию, поскольку служба воспроизведения Google запущена и отправляет ее на системный трей. Но мой onMessageReceive() не вызывается, потому что MyFirebaseMessagingService убит системой и не перезапускается. Является ли это возможным?

Ответ 1

1. Кто начал службу уведомления FirebaseMessagingService? Должно быть какое-то место, вызывающее startService(), не так ли?

SDK делает это автоматически для вас.

2. Я понимаю, что уведомление о нисходящем потоке будет доставляться на мобильную службу Google Play, независимо от состояния моего приложения. Затем, насколько я могу гарантировать, что мой onMessageReceive() вызывается, когда app или service есть swipe closed/killed/force stop? Является ли соответствующее поведение документированным где угодно?

Официальные документы для Получение сообщения для Android здесь. В нем обсуждается поведение сообщения (в зависимости от типа используемой полезной информации сообщения (т.е. notification или data)), когда ваше приложение находится на переднем плане и в фоновом режиме.

Чтобы иметь возможность обрабатывать сообщение самостоятельно (в onMessageReceived()), вам придется отправлять сообщения data -одно только сообщения.

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

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

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

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

3. Меня больше беспокоит следующий случай. Расскажите о сообщении данных. (по сравнению с уведомляющим сообщением.) Приложение-клиент получил сообщение FCM и отображает уведомление по умолчанию, поскольку служба воспроизведения Google запущена и отправляет ее на системный трей. Но мой onMessageReceive() не вызывается, потому что MyFirebaseMessagingService убит системой и не перезапускается. Возможно ли это?

AFAIK, Служба FirebaseMessagingService связана с Службой Google Play, поэтому пока Служба Google Play активна, так же как и сервис Firebase. Часть из моего ответьте здесь:

Однако, я видел, что ранее упоминалось ранее для FirebaseMessagingService (см. этот пост, комментарий от @ArthurThompson):

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