gpt4 book ai didi

android - 如何使用 Flutter 让后台应用每天下午 2 点打开一个对话框?

转载 作者:行者123 更新时间:2023-12-05 00:10:26 28 4
gpt4 key购买 nike

我希望应用程序每天下午 2 点打开一个对话框,即使用户正在做其他事情并且此时当前不在应用程序界面中。
如何用 Flutter 做到这一点,这样它就可以在 Android 和 iOS 上运行?
我正在考虑这样的方法:

timer = Timer.periodic(Duration(seconds: 60), (Timer t) => checkTime());
如果它在 14:00:00 和 14:00:59 之间,每分钟检查一次,方法类似于
flutter run function every x amount of seconds ,但这似乎是一种资源浪费:可能有更好的方法,更自然的方式可以在精确的时间在后台唤醒应用程序?
问题:如何使用 Flutter 让应用程序在每天下午 2 点显示对话框,即使用户正在做其他事情/在另一个应用程序中?
注意:如果设备已关闭屏幕(即用户未使用手机),则下次打开屏幕时应显示对话框。

最佳答案

我的解决方案是使用 workmanager (当前版本 0.4.1)flutter 包来实现您正在寻找的要求。由于它由 维护Flutter 社区团队 ,我们可以期待长期的支持。
根据他们的文档

Flutter WorkManager is a wrapper around Android's WorkManager and iOS' performFetchWithCompletionHandler, effectively enabling headlessexecution of Dart code in the background.


This is especially useful to run periodic tasks, such as fetching remote data on a regular basis.


安卓工作经理将自动处理 后台进程 单独 基于操作系统级别它正在运行的版本。
来到 iOS,根据他们的文档,此包用于执行后台操作的功能已被弃用。但是 Flutter 社区团队已准备好根据他们的 comment 在即将发布的版本中推送替换。在 GitHub 存储库中 .因此,升级到最新版本将帮助您解决此问题。
初始化 wrokmanager里面 main()
Workmanager().initialize(
callbackDispatcher, // The top level function, aka callbackDispatcher
isInDebugMode:
true // If enabled it will post a notification whenever the task is running. Handy for debugging tasks
);
然后安排如下任务
Workmanager().registerOneOffTask("1", "simpleTask_1",
initialDelay: Duration(seconds: 15));
Workmanager().registerPeriodicTask("102", "simplePeriodicTask_1",
initialDelay: Duration(seconds: 15),
frequency: Duration(minutes: 15)); // Set your 2 PM frequency here.
引用 documentation and setup有关计划任务的可用选项。
并定义一个 callbackDispatcher根据文档,它必须是静态函数或顶级函数才能作为 Flutter 入口点访问。
//Defined outside main()
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) {
print(
"Native called background task: callbackDispatcher"); //simpleTask will be emitted here.
createNotify(); // Created a local notification to make sure everything works in background - In your case show alert here.
return Future.value(true);
});
}

// your main() goes here
与其显示通知,不如推导出您的逻辑以显示警报弹出窗口。
编辑 1:
在评论中回答您的问题

How do you check the program only runs once per day at around 14:00:00PM?


计划的工作存储在内部管理的 SQLite 数据库中,WorkManager 负责确保此 工作继续并且是 在设备重新启动时重新安排 .这将被执行多次,直到手动取消。
除此之外,出于开发目的,您可以设置最小间隔并验证一次,例如 1 小时。工作经理支持的最小间隔为 15 分钟。即使您设置低于该阈值时间,15 分钟也会设置为默认值。

It seems that your code does a periodic run but it doesn't run at aspecific time.


到目前为止,它不支持开箱即用。 但是我们可以使用 初始延迟 在安排任务时。计算当前时间与您要触发的时间之间的时间差。
例如,如果我想在 9 点安排一些任务并且在安排任务时可以执行以下操作
当应用程序在 7 点打开时,将初始延迟设置为两个小时。
引用 stackoverflow answer与此有关。

Also, with this method, are you sure it won't be automatically closedby the OS for battery saving?


根据 WorkManager doc ,执行将在我们指定的时间间隔内发生。自 WorkManager 受操作系统电池优化的影响,例如 doze mod e 我们需要注意的是,执行可能会延迟但不会取消。

Last thing: can a background process start a popup without userinteraction? (other answers mention it's not really possible). Thanksagain!


对我来说,这是棘手的部分。从技术上讲,如果没有来自后台的用户操作,我们就无法显示 UI。因为,UI 需要 context基于哪个向用户显示。所以来到 dart点,可能很难显示您正在寻找的一些警报弹出窗口。但是,如果您只想显示某种信息,可以尝试 FlutterToast因为它将从背景显示给用户。
编辑 2
当应用程序未打开时,您寻求显示警报的要求称为 Draw over other apps 它仅适用于 安卓据我猜测,因为 iOS 中没有这样的功能。
你可以引用这个 package根据您的要求显示警报。结合 WorkManager使用这个包实现来达到你想要的结果。我没有尝试过这个包,但如果你遇到任何问题,请告诉我。
快乐编码!

关于android - 如何使用 Flutter 让后台应用每天下午 2 点打开一个对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68409837/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com