gpt4 book ai didi

flutter - 如何在后台运行蓝牙和位置代码?

转载 作者:行者123 更新时间:2023-12-04 13:57:27 26 4
gpt4 key购买 nike

我需要在后台运行一些代码。具体来说,我必须从连接的设备上监听蓝牙数据,监听位置变化并能够处理这些数据。

我对你将如何处理这个问题感兴趣?

经过一番调查,我了解到以下后台运行代码的方式:

1.前台服务

https://www.youtube.com/watch?v=NXuAzXY_KOo

问题:

  • native 代码 - 需要将蓝牙处理代码转换为 native 代码
  • iOS没有前台服务

  • 2. Flutter background_fetch

    https://pub.dev/packages/background_fetch

    问题:
  • 没有办法增加 fetch-event 发生的速率,这个插件将速率设置为最频繁的——你永远不会收到一个超过 15 分钟的事件。

  • 3.工作经理

    https://pub.dev/packages/workmanager

    问题:
  • 最低频率为 15 分钟。如果您配置了较低的频率,Android 会自动将您的频率更改为 15 分钟。

  • 更新:经过研究和测试,我们找到了下一个满足我们所有需求的解决方案:

    这两个平台都没有确切的解决方案。对于 android,我一直使用始终运行的前台服务。对于iOS,显然当应用程序使用蓝牙时不需要额外的代码,它不会被系统杀死,或者至少有更少的机会。另外,我的应用程序使用带有 flutter_blue 包的 Dart 代码中的蓝牙。也许重要的是要提到我们与蓝牙设备的持续连接。对于永无止境的Android服务,您可以根据这篇文章进行服务: https://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

    最佳答案

    要在后台运行任务,您可能需要考虑使用 Isolate .下面是一个关于如何实现 Isolate 的示例。

    Isolate? isolate;

    @override
    void initState() {
    /// Start background task
    _asyncInit();
    super.initState();
    }


    _asyncInit() async {
    final ReceivePort receivePort = ReceivePort();
    isolate = await Isolate.spawn(_isolateEntry, receivePort.sendPort);

    receivePort.listen((dynamic data) {
    if (data is SendPort) {
    if (mounted) {
    data.send({
    /// Map data using key-value pair
    /// i.e. 'key' : String
    });
    }
    } else {
    if (mounted) {
    setState(() {
    /// Update data here as needed
    });
    }
    }
    });
    }

    static _isolateEntry(dynamic d) async {
    final ReceivePort receivePort = ReceivePort();
    d.send(receivePort.sendPort);

    /// config contains the key-value pair from _asyncInit()
    final config = await receivePort.first;

    /// send bluetooth data you received
    d.send(...);
    }

    @override
    void dispose() {
    /// Determine when to terminate the Isolate
    if (isolate != null) {
    isolate.kill();
    }
    super.dispose();
    }
    至于 Flutter 上的蓝牙支持,你也可以考虑使用 flutter_blue

    关于flutter - 如何在后台运行蓝牙和位置代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253028/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com