如何在应用程序处于后台时,每隔10分钟处理来自Firebase的通知接收。Android 9.0

3
我需要能够在每次从Firebase接收到静默推送通知时向服务器发送我的GPS位置。当前发送通知的计时器设置为每10分钟。当手机正在充电时,这不是问题,但当手机处于空闲状态且应用程序在后台运行时,FirebaseMessagingService中的onMessageReceived仅会被调用几个小时一次。这使我认为它与Android 9.0的新电源管理规则有关。但是为了使我的应用程序正常工作,我需要能够每10分钟发送我的位置,而不只是有时。
我尝试使用Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS将电池优化设置为“未优化”,但没有任何效果。
我还尝试将Firebase通知的优先级设置为高。这确实有效,但每天仅限于10条消息,这意味着这对我的应用程序不是一个解决方案。 (来源:电源管理限制) 现在,我正在尝试通过打开一个前台服务来始终使应用程序处于“活动”存储桶中。这应该确保应用程序永远不会处于其他桶中,在那里通知可能会延迟几个小时。
如果用户正在使用应用程序,则该应用程序处于活动状态,例如:
- 应用程序已启动活动 - 应用程序正在运行前台服务 - 应用程序具有与前台应用程序使用的内容提供程序相关联的同步适配器 - 用户单击来自应用程序的通知
如果应用程序处于活动状态,则系统不会对应用程序的作业、闹钟或 FCM 消息施加任何限制。 (来源:Power Buckets Android9)
@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函数。

2个回答

1

Tim,我认为主要问题在于您发送推送通知的方式以及其内容。如果您在此处查看 - 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 Server协议:仅设置数据键。

请注意,如果您需要执行长时间运行的操作,则需要启动单独的服务(该服务应在通知区域中显示正在运行的通知,否则您将在较新的Android版本上崩溃)


嗨Yani,谢谢你的回答,但我不认为这是一个解决方案。当我们从Firebase发送请求时,我们只发送数据消息,它将始终进入onMessageReceived。我知道消息根本没有进入onMessageReceived,因为我在执行任何其他代码之前记录了remoteMessage.getFrom(),但可悲的是它没有出现在我的日志中。 - Tim 1

0

通过使用AlarmManager进行修复。在10分钟内安排一个闹钟,当完成闹钟内的代码后,在10分钟内安排一个新的闹钟。

如果手机处于待机模式,AlarmManager可以唤醒手机,这意味着触发器内的所有代码都将被正确执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接