Уведомление Android с FCM-кто запустил FirebaseMessagingService?

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

A) Класс Java

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //a) What's 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!

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

  1. кто запустил службу уведомлений FirebaseMessagingService? Там должно быть какое-то место вызова startService(), не так ли?

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

EDIT:

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

1 ответов


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

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

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

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

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

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

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

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

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

3. Меня больше беспокоит следующий случай. Давайте поговорим о сообщении данных. (по сравнению с уведомлением.) Мое клиентское приложение получило сообщение FCM и показывает уведомление по умолчанию, потому что служба google play запущена и отправляет его в системный трей. Но мой onMessageReceive () не вызывается, потому что MyFirebaseMessagingService убит системой и не перезапущен. Это возможно?

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

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

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