Как реализовать FCM onmessagereceived () listener в My Android activity

У меня есть сервер PyFCM, отправляющий уведомления через Firebase (FCM) в мое простое приложение для android. Я проверил и получить регулярные сообщения уведомления, чтобы появиться в трее, когда приложение работает в фоновом режиме нет проблем. Теперь я хотел бы получать сообщения данных в моем приложении и запускать функции приложения, когда это происходит. Я понимаю, что onMessageReceived()это запускается при получении сообщения данных, но я не уверен, как правильно реализовать этот прослушиватель в моем коде.

В документации говорится:

Переопределяя методFirebaseMessagingService.onMessageReceived, можно выполнять действия на основе полученного RemoteMessageобъекта и получать данные сообщения:

Что это значит? Я вижу, что это onMessageReceived()находится в файле под названием MyFirebaseMessagingService.java. Куда ведет этот файл?

Скажем, у меня есть функция getLocation()в моей основной деятельности.java, каковы точные шаги, чтобы получить входящее сообщение данных FCM для запуска моей getLocation()функции? Мне трудно найти конкретные примеры.

2 ответа

  1. onMessageReceived может быть вызван, когда ваше приложение не активировано на устройстве пользователя. По этой причине он работает в службе.

    Это впервые упоминается в разделе документации по доступу к маркеру регистрации устройства . Но большинство объяснений того, как это настроить, находится в разделе об обработке сообщений в документации .

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

    Пример службы FCM (MyFirebaseMessagingService.java) идет в той же папке, что и MainActivity.java, более или менее как есть (изменение имени пакета, конечно). Однако, чтобы запустить службу, я должен добавить ее в файл манифеста приложения.

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

    <?xml version="1.0" encoding="utf-8"?>
    <manifest 
        package="com.example.project">
    
        <application
            .../>
    
            <activity ...
            </activity>
    
            <service
                android_name=".MyFirebaseMessagingService">
                <intent-filter>
                    <action android_name="com.google.firebase.MESSAGING_EVENT"/>
                </intent-filter>
            </service>
    
        </application>
    </manifest>