iOS部分使用bluetooth-central后台执行模式时如何暂停Flutter在后台运行

Dom*_*ski 5 ios core-bluetooth flutter flutter-engine

我的应用程序使用CoreBluetooth 状态恢复和保存 (SRP)连接到 BLE 配件,并使用bluetooth-central后台执行模式。这意味着用 Swift 编写的应用程序的本机部分即使在应用程序处于后台时也可以连续接收 HR 样本。然而,我还可以看到,尽管应用程序处于paused生命周期状态,但应用程序的 Flutter 部分仍在运行。

我做了一个简单的实验,并在使用不使用Core Bluetooth SRP时在 Flutter 中启动计时器。

  • 不使用 SRP 时,计时器会在 20 秒后停止打印到日志中
  • 使用 SRP 时,只要 BLE 配件发送 HR 样本,定时器就会无限期地运行

我想要的是保持典型的Flutter 行为,但继续在本机端使用 SRP。

  1. 当应用程序进入暂停状态时,Flutter 的哪一部分负责停止“执行”?
  2. 尽管 SRP 使应用程序保持唤醒状态(由于使用bluetooth-central模式和接收连续的 HR 更新),Flutter 是否可以暂停?
  3. 有没有办法让 Flutter 引擎以paused编程方式声明?
  4. 如果没有,您是否看到任何其他方法来保持典型的Flutter 引擎/ViewController 行为?

Pav*_*sha 5

这里的问题存在某种误解。当 flutter 部分出现时,paused,并不意味着它默认暂停执行。当你进入这种状态时,你必须手动暂停所有需要的东西。

\n

对于大多数“功能性(非 ui)”情况,这些状态WidgetsBindingObserver捕获仅仅是“指示”而不是“操作”...当您收听在后台发出的本机部分时,这尤其适用。

\n

以下是官方文档中的一些解释:

\n
\n

已暂停 \xe2\x86\x92 const AppLifecycleState

\n

该应用程序当前对用户不可见,并且不响应用户输入。

\n

当应用程序处于此状态时,引擎不会调用 PlatformDispatcher.onBeginFrame 和 PlatformDispatcher.onDrawFrame 回调。

\n

仅在 iOS 和 Android 上进入此状态。>

\n
\n

这意味着 Flutter 引擎只会跳过在屏幕上绘制内容 - 所有其他操作都是活动的,并且将一直活动到应用程序死亡为止。就 iOS 而言,除非显式终止应用程序,否则这种情况可能永远不会发生。在 Android 中,操作系统可以在任意时间杀死它或不杀死它 - 取决于操作系统本身的负载。

\n

要忽略该paused状态期间的任何活动,您必须显式手动取消订阅该paused状态中的任何侦听器,然后在该状态中再次订阅它们resumed。我说“订阅”和“取消订阅”之类的词是因为我不知道你的代码的具体细节 - 你可能很容易忽略所有事件或其他东西......

\n

如果您希望 flutter 部分在应用程序处于后台时根本不运行,则必须手动终止 flutter 部分 - 如果您手动建立 flutter 引擎连接,而不是依赖 等FluttFlutterViewController,则可以做到这一点FlutterFragment。您必须为了做到这一点,可以控制代码。之后,当您的应用程序再次位于前台时(要知道您必须依赖本机回调,因为当 flutter 引擎停止运行时,dart 代码中没有回调),您将能够重新建立 flutter 基础设施并运行再来一次。

\n

我不推荐后一种方法,因为它太多余了——在大多数情况下,忽略事件和/或订阅/取消订阅就足够了。我想甚至包括你的。

\n

希望能帮助到你。

\n