我正在开发一个带有flutter的计时器应用程序,它应该以固定的重复间隔将它的时间同步到我的服务器上。所以,当用户启动计时器时,应用程序应该每隔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警报管理器方法,比如periodic (这个方法的问题是它不是完全周期性的)和参数,但没有注意到改进
感谢您的阅读和帮助!
发布于 2021-06-18 14:07:57
首先,您需要检查您的后台服务在哪里没有运行,或者告警管理器没有触发。添加日志之前
await BackgrdoundService().sync();因为可能是Android限制了后台服务。请查看此链接以了解更多信息https://developer.android.com/about/versions/oreo/background
其次,最好使用WorkManager而不是AlarmManager,因为它在安卓中已被弃用。
如果问题是后台服务限制,那么不要运行服务,而是将您的逻辑放在function中。
https://stackoverflow.com/questions/68029511
复制相似问题