gpt4 book ai didi

java - 如何在应用程序处于后台时每 10 分钟处理一次从 Firebase 收到的 onNotificationReceived。安卓9.0

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:01 25 4
gpt4 key购买 nike

每次收到来自 Firebase 的静默推送通知时,我都需要能够将我的 GPS 位置发送到服务器。发送通知的计时器当前设置为每 10 分钟一次。当手机正在充电时,这不是问题,但当手机空闲且应用程序在后台时,FirebaseMessagingService 的 onMessageReceived 每隔几个小时才会调用一次。这让我相信它与Android 9.0的新电源管理规则有关。但是为了让我的应用程序正常工作,我需要能够每 10 分钟发送一次我的位置。不只是有时。

我尝试使用 Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 将电池优化设置为“未优化”
这似乎没有任何效果。

我还尝试将 Firebase 通知的优先级设置为高。这有效,但每天只能发送 10 条消息,这意味着它不是我的应用程序的解决方案。 (Source: Power Management restrictions)

我现在试图通过打开一个 foregroundService 使应用程序始终处于“Activity ”存储桶中。这应该确保应用程序永远不会在任何其他桶中,通知可以延迟几个小时。

An app is in the active bucket if the user is currently using the app, for example:

  • The app has launched an activity
  • The app is running a foreground service
  • The app has a sync adapter associated with a content provider used by a foreground app
  • The user clicks on a notification from the app

If an app is in the active bucket, the system does not place any restrictions on the app's jobs, alarms, or FCM messages.

(Source: 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 函数。

最佳答案

蒂姆,我认为主要问题在于您如何发送推送通知及其内容。如果你在这里检查 - https://firebase.google.com/docs/cloud-messaging/android/receive您会看到,如果消息包含通知数据并且应用程序处于后台,则推送通知会转到通知区域。您需要发送仅包含数据的推送通知:(在这里您可以找到有关不同类型的更多信息 - https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages)这是如何触发它的解释 -在 Cloud Functions 或您的应用服务器等可信环境中,使用 Admin SDK 或 FCM 服务器协议(protocol):仅设置数据 key 。

请注意,如果你需要做一个长时间运行的操作,那么你需要启动一个单独的服务(该服务应该在通知区域显示它正在运行的通知,否则你会在较新的上崩溃安卓版本)

关于java - 如何在应用程序处于后台时每 10 分钟处理一次从 Firebase 收到的 onNotificationReceived。安卓9.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56834091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com