android - 在特定时间在 Flutter 应用程序中运行任务
问题描述
你好颤振/移动开发者,
我手头有一个特殊的问题,我需要一些建议。我需要创建一个在一天中的特定时间执行特定任务的应用程序。时间每天都会变化,它会在午夜(或非高峰时间)通过 REST 调用获取更新的时间。无论如何,任务必须在预定的时间完成,即使在设备重启等之后。我已经对此进行了广泛的研究,我感觉 Flutter 不能很好地处理预定的任务,尤其是在 iOS 中,它可以终止一个应用程序无论出于何种原因。
我研究过的选项是:
workmanager(https://pub.dev/packages/workmanager/changelog):这似乎是最有希望的,如果不是 15 分钟的最低频率,这对我来说还不够。如果是时候完成任务,我需要每分钟检查一次。有没有办法绕过这个限制?
本机解决方案。我对原生 iOS 和 Android 编码几乎没有经验,所以我不喜欢这个解决方案。但是通过一些研究,我看到了一些可以通过这种方法安排任务的示例。
服务器端通知。从表面上看,这似乎是一个很好的解决方案,我需要这方面的建议。是否该运行任务的计算将发生在服务器端,并且可以向设备发送通知(例如通过 Firebase),这将触发任务运行。这是否可行,设备在收到通知时会实际运行代码吗?
所以这些是我的选择。你觉得哪个最可行?如果比我有更多移动经验的人可以帮助我,我将不胜感激,也许有比我提出的三个更好的解决方案。谢谢你。
解决方案
时间每天都会变化,它会在午夜(或非高峰时间)通过 REST 调用获取更新的时间。
这闻起来像糟糕的建筑。为什么?
- 您在午夜对更新服务器进行 DDOS 攻击(如果您在同一时区有很多用户)。您可以将 HTTP 请求错开几秒钟来解决此问题,但这是一种创可贴,而不是长期解决方案。
- 因为您正在反转依赖关系:听起来时间是服务器的责任(因此您的客户调用它来询问最新时间)。您的客户端不应该是向服务器请求更新的人,因为现在您的客户端有 2 个作业:安排计划更新并为用户安排计划任务。让客户询问服务器是错误的方向。您应该从服务器发送消息以更新设备上的计划。
- 即使您确实轮询服务器以获取计划更新,您也应该让移动应用程序在您想要的时间安排通知/警报。使用静默通知是 iOS 上后台调度限制的已知解决方法。在 Android 上,WorkManager不是正确的库,您应该使用
AlarmManager
. - 下面是另一个 StackOverflow 考虑使用本地通知来解决问题的方法:他们使用了 flutter_local_notifications
回答要点
- 在 Android 上,不要使用 WorkManager,而是使用AlarmManager,甚至更好的是安排通知。话虽如此,Android 上有一些制造商特定的怪癖,请参阅flutter_local_notifications文档:
因此,当应用程序在某些设备(例如小米、华为)的后台时,预定通知可能不起作用。如果您遇到这样的问题,那么这就是原因。由于这是操作系统强加的限制,这不是插件可以解决的问题。
- 不需要使用本机代码,通知是标准功能。
- 您现在可以保留轮询架构,因为它更简单(但更脏)。即使您愿意使用服务器端架构,我也会从服务器向客户端发送消息以仅更新客户端计划,而不是触发工作/用户警报,否则当它不响时,您会使您的应用程序依赖于互联网就像需要互联网一样(与社交媒体通知不同)。对于连接不良的设备,这将导致糟糕的用户体验。
推荐阅读
- kubernetes - 通过 clusterIP 服务将 Pod 连接到 Pod?
- logging - LTTNG 是否可以进行日志轮换?
- python - 我无法通过 pycharm 的控制台运行代码
- php - 如何加入 laravel 关系
- amazon-web-services - 使用 pyspark (spark 2.4) 从 S3 读取 csv 作为 spark 数据帧
- python - 如何在 Dockerfile 中安装带有 miniconda 的软件包?
- android - 如何使用行 ID 将数据加载到详细活动中?
- javascript - 在 Acrobat JS API 中将透明颜色设置为 strokeColor 会导致黑色边框
- javascript - 我无法让这个程序将最终计算结果输出到网页
- java - 如何通过 JPA 获取已保存对象的 id?