每次从Firebase收到静默推送通知时,我都需要能够将GPS位置发送到服务器。当前,发送通知的计时器设置为每10分钟一次。当电话正在充电时,这不是问题,但是当它处于空闲状态并且应用程序处于后台时,仅每隔几个小时就会调用一次来自FirebaseMessagingService的onMessageReceived。这使我相信它与Android 9.0的新电源管理规则有关。但是要使我的应用程序正常运行,我需要能够每10分钟发送一次我的位置信息。不只是有时候。
我尝试使用Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
将电池优化设置为“未优化”
这似乎没有任何效果。
我还尝试将Firebase通知的优先级设置为“高”。这有效,但是每天仅处理10条消息,这意味着它不是我的应用程序的解决方案。 (Source: Power Management restrictions)
我现在正试图通过打开前台服务,将应用程序始终保存在“活动”存储区中。这应该确保该应用永远不会出现在其他任何存储桶中,在这些存储桶中,通知可能会延迟几个小时。
如果用户当前正在使用该应用,则该应用位于活动存储桶中,例如:
- 该应用已启动一项活动
- 该应用正在运行前台服务
- 该应用具有与前景应用所使用的内容提供商关联的同步适配器
- 用户点击应用中的通知
如果应用程序处于活动存储桶中,则系统不会对该应用程序的作业,警报或FCM消息施加任何限制。
(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函数。
答案 0 :(得分:0)
蒂姆, 我认为主要问题在于您如何发送推送通知及其内容。 如果您在此处查看-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服务器协议:仅设置数据密钥。
请注意,如果您需要长时间运行,则需要启动一个单独的服务(该服务应在正在运行的通知区域中显示一条通知,否则您将在较新的版本上崩溃Android版本)
答案 1 :(得分:0)
使用AlarmManager修复。在10分钟内安排一个警报,在完成警报中的代码后,在10分钟内安排一个新警报。
如果处于休眠模式,AlarmManager可以唤醒手机,这意味着触发器内的所有代码都将正确执行。