Как обрабатывать onNotificationReceived от Firebase каждые 10 минут, пока приложение находится в фоновом режиме. Android 9.0 - PullRequest
3 голосов
/ 01 июля 2019

Мне нужно иметь возможность отправлять свое GPS-местоположение на сервер каждый раз, когда я получаю извещение без уведомления от Firebase.Таймер отправки уведомления в настоящее время установлен на каждые 10 минут.Когда телефон заряжается, это не проблема, но когда он простаивает и приложение находится в фоновом режиме, onMessageReceived от FirebaseMessagingService вызывается только каждые несколько часов.Это наводит меня на мысль, что это как-то связано с новыми правилами управления питанием для Android 9.0.Но чтобы мое приложение работало, мне нужно каждые 10 минут отправлять свое местоположение.Не просто иногда.

Я пытался установить оптимизацию батареи на «неоптимизирован» с помощью Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
Это, похоже, не имеет никакого эффекта.

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

Я сейчас пытаюсь всегда держать приложение в «активной» корзине, открывая службу foregroundService.Это должно гарантировать, что приложение никогда не будет в каком-либо другом ведре, где уведомления могут быть отложены на несколько часов.

Приложение находится в активном сегменте, если пользователь в данный момент использует приложение, например:

  • Приложение запустило действие
  • приложение запускает службу переднего плана
  • Приложение имеет адаптер синхронизации, связанный с поставщиком содержимого, используемым приложением переднего плана
  • Пользователь нажимает на уведомление из приложения

Если приложение находится в активном сегменте, система не накладывает никаких ограничений на задания, сигналы тревоги или сообщения FCM.

(Источник: Power Buckets Android9) .

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

Это моя функция onMessageReceived:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        Map<String, String> params = remoteMessage.getData();
        JSONObject object = new JSONObject(params);

        PushNotificationManager.getInstance().handlePushNotification(object, getApplicationContext());
    }
}

Сейчас я не понимаю, почему сообщения Firebase не входят в функцию onMessageReceived.

1 Ответ

0 голосов
/ 01 июля 2019

Тим, Я думаю, что основная проблема заключается в том, как вы отправляете push-уведомления и каков его контент. Если вы проверите здесь - https://firebase.google.com/docs/cloud-messaging/android/receive вы увидите, что если сообщение содержит данные уведомления, а приложение находится в фоновом режиме, то push-уведомление отправляется в область уведомлений. Вам необходимо отправить push-уведомление, содержащее только данные: (Здесь вы можете найти больше информации о различных типах - https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages) Вот что объясняет, как это В доверенной среде, такой как облачные функции или сервер приложений, используйте Admin SDK или протоколы сервера FCM: задайте только ключ данных.

Обратите внимание, что если вам нужно выполнить длительную операцию, вам нужно будет запустить отдельную службу (служба должна представить уведомление в области уведомлений, что она работает, в противном случае вы получите сбой на более новой версии). Версии для Android)

...