- 目前,我负责的Android应用程序每分钟在服务器上执行一次"拉动",以恢复数据并使用此数据更新片段。显然,当设备切换到打瞌睡模式时,这不起作用。所以我决定按照谷歌的建议使用FCM。
约束条件:
-
用户需要知道即使在打瞌睡模式下也可以使用新数据。
-
为了不对应用程序进行太多更改,我不想在收到 fcm 消息时发送 firebase 消息中的数据,而是向服务器发送 https 请求。
-
fcm 消息必须:
-
通知用户有新数据可用。
-
如果用户在打开屏幕后按下通知或返回应用程序,则必须触发 https 请求并更新片段。 我将补充一点,它必须最迟在用户返回应用程序时触发。
-
我现在的解决方案
我使用了具有高优先级的数据消息而不是通知消息,因为通知消息需要用户录制通知以触发操作。
在收到消息中:
- 我发送重定向到我的应用程序的通知。
- 我将请求发送到服务器并更新我的应用程序。
我的解决方案的缺点:
- 如果我的应用程序在屏幕关闭时被系统杀死,这是怎么回事?
- 我的请求有时间限制,当手机退出打瞌睡模式时完成。
问题:
- 这个解决方案是最好的吗?
- 有没有其他方法可以继续?
- 也许我可以安排一个任务,当用户在收到消息中恢复我的应用程序时立即运行?但我不知道该怎么做。
使用 WorkManager 安排后台工作立即运行。 它还将重试,直到您的代码指示它成功。
我回答自己结束这个主题,希望它可以帮助某人!
- 一夜后...我绝对不喜欢工作管理器解决方案。即使在实践中它可以工作,我也不喜欢将 API 用于计划外的用途。如果谷歌告诉我立即启动任务并不重要,他们(:))比我好,我相信他们!
在这种情况下,我认为我的任务可能会被推迟,例如因为操作系统想要将呼叫与其他应用程序分组。可能有我不知道的内部条件。
- 特别是因为我找到了一个更简单的解决方案。
在 onMessageReceived 中,我使用了一个简单的布尔指示符。 在我要更新的活动的 onResume 中,我阅读了此指标,例如,如果为 true,则启动我的请求。
我不再需要调度程序,毕竟如果它不是 100% 可靠的,没关系:
- 如果 fcm 可以向我发送消息,那么当用户打开屏幕时,很有可能有网络。
- 即使没有,也不是很严重,因为我可以警告可以继续的用户(例如通过打电话!!!)