【问题标题】:Flutter app continues running in background and causes unwanted battery drainFlutter 应用程序继续在后台运行并导致不必要的电池消耗
【发布时间】:2021-05-28 12:18:38
【问题描述】:

我正在开发一个 Flutter 应用,用于控制连接到本地网络的 IoT 设备。

不幸的是,在测试应用程序时,我遇到了以下问题:根据 iOS 设置应用程序,该应用程序负责很大比例的当前电池消耗,即使在屏幕时间很短的情况下也是如此。换句话说,应用在后台运行时正在耗尽手机的电池电量。

我对此问题进行了一些研究,得出的结论是,当用户返回主屏幕或切换到其他应用程序时,Flutter 应用程序应该被暂停。 事实上,有无数文章描述了即使在应用程序被挂起后仍然执行代码的方法。

这对我来说似乎不是这样。出于测试目的,我创建了一个周期性计时器,它会在每秒钟通过时打印一条消息。我还通过WidgetsBindingObserver 收听应用程序生命周期状态的变化。 这是我得到的输出:

如您所见,即使在应用程序暂停后(通过我按下 Home 按钮),计时器仍处于活动状态。

当用户将应用发送到后台时,有没有办法正确暂停应用?

技术信息:

Flutter Doctor 输出:

[✓] Flutter (Channel stable, 2.2.0, on macOS 11.3.1 20E241 darwin-arm, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS
[✗] Chrome - develop for the web (Cannot find Chrome executable at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome)
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
[✓] Android Studio (version 4.1)
[✓] VS Code (version 1.56.2)
[✓] Connected device (2 available)

! Doctor found issues in 1 category.

控制台输出是在运行 iOS 14.4 的 iPhone 8 上生成的,但我在 Android 上也观察到了这个问题。

提前致谢,ThePC007。

【问题讨论】:

    标签: flutter background-process battery suspend


    【解决方案1】:

    在您的Widget 上覆盖dispose 方法,如下所示。

    @override
      void dispose() {
        timer.cancel();
        super.dispose();
      }
    

    当您的应用在后台时,这将取消计时器

    【讨论】:

    • 在应用程序暂停时似乎不会调用小部件的 dispose 函数,因为这实际上并没有解决问题。无论哪种方式,我当然可以在生命周期状态更改为AppLifecycleState.paused 时取消我的所有计时器,但是我认为问题可能出在其他地方,考虑到即使应用程序仍在运行(从我能找到的) ,确实不应该。恐怕即使取消所有定时器,能耗仍然很高。
    • 讽刺的是,这么多人说“我怎样才能让我的应用程序在后台运行,就像每秒记录我的位置一样”,而他们没有意识到这将是一个电池杀手。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多