FCM + Workmanager

4

我目前正在更新一个应用程序,其工作流程如下:

  1. 我们上传一条带有某些数据的记录到Firestore数据库中。
  2. 通过谷歌云,这自动生成了一个推送通知,并通过通道发送到我们用户的设备。
  3. 设备接收到此通知,并使用FCM的onMessageReceived函数触发与Firestore数据库的同步。
  4. 尝试与Firestore数据库同步。
  5. 无论这个同步是否正确,推送通知仍然会显示给用户。当他按下时,应用程序会崩溃。

不过,我认为当Android进入深度睡眠模式(Doze mode)时,第4步会出现错误;因此设备无法与Firestore数据库同步,因此对于约20%的用户,应用程序将崩溃。

然后我发现了Workmanager,我相信它可以帮助解决这个问题。不过,我对此还是很陌生。我在考虑一个解决方案:

我专门创建一个WorkRequest,并设置一个约束条件,说明设备必须连接到互联网。在这个WorkRequest中,我将执行此数据库同步以及向用户显示通知。

然而,这可能会导致一些延迟,因为它取决于用户何时连接他们的设备到互联网。理想情况下,我认为最好的解决方案是像这里描述的那样。最终,在我的情况下,同步(计划任务)由外部事件(FCM)触发,但我很难理解这是否真的是最佳解决方案。
你认为呢?第一个解决方案好吗?如果第二个更好,您是否有代码示例(基本框架),以便我了解如何将WorkManager与FCM相关联?或者Workmanager也许不是这个问题的最佳解决方案?
非常感谢!

请提供足够的代码,以便他人更好地理解或重现问题。 - Community
1个回答

1

请阅读此处:

https://developer.android.com/topic/performance/appstandby

在这里:

https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message

简而言之 - 如果您使用推送通知,您需要给予消息高优先级,以便用户与其交互,并将应用程序移动到活动桶中。即使在待机模式下也可以工作。

但是,如果没有用户交互:

  • 您在接收推送通知后有很短的时间段,因此应用程序很快就会重新进入睡眠状态(这通常是推送通知的工作方式)。
  • 通常情况下,这是创建服务的地方,以免被杀死,但由于从后台启动前台服务的新限制,现在更难做到:https://developer.android.com/about/versions/12/behavior-changes-12#foreground-service-launch-restrictions基本上,Google正在强制我们使用WM。
  • 如果您将优先级设置为高,但用户不点击通知,只是将其关闭 - 它将被降低优先级,并且将不再为您工作。
  • 如果您的优先级较低,那么您唯一的选择就是从推送通知开始工作,当满足约束条件时,执行您的工作。

基本上这是我的建议:

  1. 使用低优先级发送推送。您不需要用户。

  2. 创建具有正确约束条件的工作来完成任务。(您可以在应用程序中设置一些选项,例如Wi-Fi或非Wi-Fi、高/低电池、充电或未充电等) https://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work#work-constraints

  3. 当工作开始时,您可以显示一个通知(它是API的一部分-ForegroundInfo),表示正在进行同步,当工作完成时,您可以显示一些通知表示同步已完成。

此外,请注意,当您收到下一个推送时,可能会有未完成的工作。因此,请寻找链接工作和唯一工作。

例如,您可能只想要一个工作,并且使用唯一工作-您可以替换旧工作,甚至将新工作附加到旧工作中。请在此处查看:

https://developer.android.com/topic/libraries/architecture/workmanager/how-to/managing-work#conflict-resolution

我建议你观看这个播放列表。最后,还有一个与WM背后的人们进行问答环节。你将理解大部分你所需要的东西:

https://www.youtube.com/watch?v=NtpgWjiXEfg&list=PLWz5rJ2EKKc_J88-h0PhCO_aV0HIAs9Qk&ab_channel=AndroidDevelopers


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