Flutter应用程序在后台持续运行并导致不必要的电池耗尽。

3
我正在开发一个Flutter应用程序,旨在用于控制连接到本地网络的物联网设备。
不幸的是,在测试应用程序时,我遇到了以下问题:根据iOS设置应用程序,即使屏幕时间很短,该应用程序也负责大部分当前电池耗电量。换句话说,该应用程序在后台运行时会耗尽手机的电池。
我已经对这个问题进行了一些研究,并得出结论,Flutter应用程序在用户返回主屏幕或切换到其他应用程序时应该被挂起。 事实上,有无数的文章描述了即使应用程序已被挂起仍然执行代码的方法。
但对我来说似乎并非如此。为了测试目的,我创建了一个周期性计时器,每秒钟打印一条消息。我还通过WidgetsBindingObserver监听应用程序生命周期状态更改。 这是我得到的输出:

terminal screenshot

正如您所看到的,即使应用程序已通过我按下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。
1个回答

0
在你的Widget中重写dispose方法,如下所示。
@override
  void dispose() {
    timer.cancel();
    super.dispose();
  }

当您的应用程序在后台运行时,这将取消计时器。


似乎在应用程序暂停时,并没有调用小部件的dispose函数,因此这并没有真正解决问题。无论如何,当生命周期状态变为AppLifecycleState.paused时,我当然可以取消所有计时器,但考虑到应用程序仍在运行(根据我所找到的信息),我相信问题可能出在其他地方。我担心即使取消所有计时器后,能源消耗可能仍然很高。 - undefined
很讽刺的是,很多人都说“我怎么能让我的应用在后台运行,比如每秒记录我的位置”,却没有意识到这会耗电非常厉害。 :) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接