【问题标题】:Syncing data from flutter app to server in background在后台将数据从 Flutter 应用程序同步到服务器
【发布时间】:2021-06-18 04:55:43
【问题描述】:

我正在开发一个带有颤振的计时器应用程序,它应该以固定的重复间隔将时间同步到我的服务器。因此,当用户启动计时器时 - 即使手机被锁定,应用程序也应该每 5 分钟向我的服务器发送一次确认“计时器正在运行”之类的信息。 我尝试使用以下方法通过android alarm manager plugin 实现它:

await AndroidAlarmManager.oneShot(Duration(minutes: 5), MY_ID, syncFn, exact: true, allowWhileIdle: true);

syncFn 向我的服务器发送一个请求,然后重新安排相同的警报,所以它看起来像这样:

static void syncFn() async {
    try{
      // send confirmation that app is running to my server
      await BackgrdoundService().sync();
    } catch (err) {
      print(err);
    } finally {
      await AndroidAlarmManager.oneShot(Duration(minutes: 5), MY_ID, syncFn, exact: true, allowWhileIdle: true);
    }
  }

当我启动我的计时器时 - 即使手机被锁定,syncFn 第一次执行也不会出现问题,但是当手机被锁定时执行此方法时 - 5 分钟后它不会再触发下一次。另外,15分钟后也不触发,只有在手机屏幕解锁或连接手机充电器时才会触发。

我了解,这是由操作系统电池使用优化引起的,但我不知道如何避免。

我是移动应用程序开发的新手,如果这种从移动应用程序向服务器发送数据的方法是错误的,请告诉我。我已经阅读了 FCM,但我可以看到它用于下游消息传递,不能在我的情况下使用。 此外,我尝试使用其他 android 警报管理器方法,如周期性(这种方法的问题是它不是精确的周期性)并使用参数,但没有注意到改进

感谢您的阅读和帮助!

【问题讨论】:

    标签: android flutter


    【解决方案1】:

    首先,您需要检查您的后台服务没有在哪里运行,或者警报管理器没有触发。在之前添加日志

    await BackgrdoundService().sync();
    

    因为可能是 Android 限制了后台服务。检查此链接以获取更多信息 https://developer.android.com/about/versions/oreo/background

    其次,最好使用 WorkManager 而不是 AlarmManager,因为它在 android 中已被弃用。

    如果问题是后台服务限制,那么不要运行服务,而是将你的逻辑放在函数中。

    【讨论】:

    • 感谢您的回答,WorkManager 的最短时间为 15 分钟,这对我来说太大了。我想开始实施前台服务
    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2019-01-03
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多