我的应用程序使用 CoreBluetooth 状态恢复和保存 (SRP) 连接到 BLE 配件。这意味着即使应用程序处于后台,应用程序的本机部分也可以连续接收 HR 样本。然而,我还可以看到,尽管应用程序处于
paused
生命周期状态,但应用程序的 Flutter 部分仍在运行。
我做了一个简单的实验,并在使用和不使用核心蓝牙SRP时在Flutter中启动计时器。
我正在寻找的是保持典型 Flutter 行为,但继续在本机端使用 SRP。
paused
状态?这里的问题存在某种误解。当 flutter 部分为
paused,
时,并不意味着它默认暂停执行。当你进入这种状态时,你必须手动暂停所有需要的东西。
WidgetsBindingObserver
捕获仅仅是“指示”而不是“操作”...当您聆听在后台发出的本机部分时,这尤其适用。
这是来自官方文档的一些解释:
暂停 → const AppLifecycleState
应用程序当前对用户不可见,并且不响应用户输入。
当应用程序处于此状态时,引擎不会调用 PlatformDispatcher.onBeginFrame 和 PlatformDispatcher.onDrawFrame 回调。
此状态仅在 iOS 和 Android 上进入。>
这意味着 Flutter 引擎只会跳过在屏幕上绘制内容 - 所有其他操作都是活动的,并且将一直活动到应用程序死亡为止。就 iOS 而言,除非显式终止应用程序,否则这种情况可能永远不会发生。在 Android 中,操作系统可以在任意时间杀死它或不杀死它 - 取决于操作系统本身的负载。
要忽略
paused
状态期间的任何活动,您必须显式手动取消订阅“暂停”状态下的任何侦听器,并在 resumed
状态下再次订阅它们。我说“订阅”和“取消订阅”这样的词是因为我不知道你的代码的具体情况 - 你可能很容易忽略所有事件或其他东西......
如果您希望 flutter 部分在应用程序处于后台时根本不运行,则必须手动终止 flutter 部分 - 如果您手动建立 flutter 引擎连接,而不是依赖于
FluttFlutterViewController
,,则可以做到这一点FlutterFragment
等等。你必须控制代码才能做到这一点。之后,当您的应用程序再次位于前台时(要知道您必须依赖本机回调,因为当 flutter 引擎停止运行时,dart 代码中没有回调),您将能够重新建立 flutter 基础设施并运行再来一次。
我不推荐后一种方法,因为它太多余了——在大多数情况下,忽略事件和/或订阅/取消订阅就足够了。我想甚至包括你的。
希望有帮助。