dart 如何在flutter中运行设备 Boot 代码?

6jygbczu  于 2023-02-06  发布在  Flutter
关注(0)|答案(1)|浏览(143)

我试图在android设备启动时运行一段dart代码,理想情况下,代码应该立即运行或稍有延迟(最多1-2分钟),我不希望应用程序启动,只是运行一段无头代码。

我的使用案例

我正在开发一个闹钟应用程序,我想处理设备关闭时发出的闹钟,比如禁用一次性闹钟,如果是重复闹钟,则安排下一个闹钟。如果用户启动设备后不久就安排了重复闹钟,我不能等待太长时间来处理这些情况。

我的尝试

我试过用flutter_background_fetchheadless: truestartOnBoot: true来做这件事,但是它每隔15分钟运行一次代码,这对于我的用例来说太长了,正如上面解释的那样。

eaf3rand

eaf3rand1#

所以我终于明白了。我首先找到了这篇很棒的文章Initiating calls to Dart from the native side in the background,详细介绍了如何在后台调用dart代码。这只是其中的一部分,因为我必须弄清楚如何从BroadcastReceiver调用dart代码。幸运的是,我意识到android_alarm_manager_plus做了类似的事情。所以使用这两个资源中的代码,我设法让它工作。
该代码可在flutter_boot_receiver上获得,并附有使用说明。

工作原理的详细信息

1.将dart回调句柄发送到本机端,并存储在SharedPreferences中。
1.指定侦听BOOT_COMPLETED事件的BootReceiver。此事件由android系统在设备启动时激发。
1.当BootReceiver接收到事件时,它将启动JobIntentService
1.服务创建一个后台FlutterEngine和一个方法通道来与dart代码通信。
1.然后,它从SharedPreferences检索dart回调句柄,并通过方法通道将其发送到dart端。
1.然后dart端从句柄中检索回调,然后调用它。

注解

1.回调函数在一个隔离函数中运行,所以不能访问在主dart隔离函数中初始化的数据。但是你可以使用dart包/插件。如果需要的话,请确保在隔离函数中初始化它们。
1.某些设备可能未接收到BOOT_COMPLETED事件。您可以找到here的详细信息。如果是这种情况,请考虑在存储库中创建一个问题。

相关问题