iOS部分使用状态恢复时如何暂停后台运行的Flutter

问题描述 投票:0回答:1

我的应用程序使用 CoreBluetooth 状态恢复和保存 (SRP) 连接到 BLE 配件。这意味着即使应用程序处于后台,应用程序的本机部分也可以连续接收 HR 样本。然而,我还可以看到,尽管应用程序处于

paused
生命周期状态,但应用程序的 Flutter 部分仍在运行。

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

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

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

  1. 当应用程序进入暂停状态时,Flutter 的哪一部分负责停止“执行”?
  2. 尽管 SRP 开启,Flutter 是否可以暂停?
  3. 有没有办法以编程方式将 Flutter 引擎置于
    paused
    状态?
  4. 如果没有,您是否看到任何其他方法来保持典型 Flutter 引擎/ViewController 行为?
ios flutter core-bluetooth flutter-engine
1个回答
0
投票

这里的问题存在某种误解。当 flutter 部分为

paused,
时,并不意味着它默认暂停执行。当你进入这种状态时,你必须手动暂停所有需要的东西。

对于大多数“功能性(非 ui)”情况,这些状态

WidgetsBindingObserver
捕获仅仅是“指示”而不是“操作”...当您聆听在后台发出的本机部分时,这尤其适用。

这是来自官方文档的一些解释:

暂停 → const AppLifecycleState

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

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

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

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

要忽略

paused
状态期间的任何活动,您必须显式手动取消订阅“暂停”状态下的任何侦听器,并在
resumed
状态下再次订阅它们。我说“订阅”和“取消订阅”这样的词是因为我不知道你的代码的具体情况 - 你可能很容易忽略所有事件或其他东西......

如果您希望 flutter 部分在应用程序处于后台时根本不运行,则必须手动终止 flutter 部分 - 如果您手动建立 flutter 引擎连接,而不是依赖于

FluttFlutterViewController
,则可以做到这一点FlutterFragment
等等。你必须控制代码才能做到这一点。之后,当您的应用程序再次位于前台时(要知道您必须依赖本机回调,因为当 flutter 引擎停止运行时,dart 代码中没有回调),您将能够重新建立 flutter 基础设施并运行再来一次。

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

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.