我试图在android设备启动时运行一段dart代码,理想情况下,代码应该立即运行或稍有延迟(最多1-2分钟),我不希望应用程序启动,只是运行一段无头代码。
我的使用案例:
我正在开发一个闹钟应用程序,我想处理设备关闭时发出的闹钟,比如禁用一次性闹钟,如果是重复闹钟,则安排下一个闹钟。如果用户启动设备后不久就安排了重复闹钟,我不能等待太长时间来处理这些情况。
我的尝试:
我试过用flutter_background_fetch、headless: true
和startOnBoot: true
来做这件事,但是它每隔15分钟运行一次代码,这对于我的用例来说太长了,正如上面解释的那样。
1条答案
按热度按时间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的详细信息。如果是这种情况,请考虑在存储库中创建一个问题。