.NET MAUI中应用处于后台时如何保持计时器持续运行?
跨平台步行应用后台计时器解决方案需求
我正在开发一款支持Android和iOS的步行应用,需要实现持续记录步行时长的计时器:应用切换到后台时计时器需正常运行,用户从后台调回应用时能看到累计时长。
我已尝试使用Shiny 3.0,但开发者Allan Ritchie表示Shiny无法实现该功能。以下是我ViewModel中的代码:
private void RunTimer() { _dispatcher.StartTimer(TimeSpan.FromMilliseconds(100), () => { _dispatcher.Dispatch(() => { App.TotalRunningTime = DateTime.Now - App.CurrentWalkStartingDateTime - App.TotalPausedTime; var hours = App.TotalRunningTime.Hours; var minutes = App.TotalRunningTime.Minutes; var seconds = App.TotalRunningTime.Seconds; TimerText = String.Format("{0:00} : {1:00} : {2:00}", hours, minutes, seconds); // StepsCount = DependencyService.Get<IStepCounter>().Steps; }); return TimerRunning; }); }
可行解决方案
1. 重构核心计时逻辑(跨平台通用)
当前代码依赖前台定时器轮询,后台会被系统暂停,必须改用时间戳记录+按需计算的方式:
- 记录三个关键值:步行开始时间
WalkStartTime、暂停触发时间PauseStartTime、累计暂停总时长TotalPauseSeconds - 无需后台持续运行定时器,每次需要显示时长时,直接计算:
(当前时间 - WalkStartTime).TotalSeconds - TotalPauseSeconds - 暂停/恢复时更新对应时间戳和累计时长即可
2. 平台适配后台运行
Android端
- 启用前台服务:将步行计时的状态管理放在前台服务中,系统会给予更高优先级,避免被后台回收
- 服务中维护时间戳数据,应用回到前台时,通过绑定服务获取最新状态更新UI
iOS端
- 申请后台任务权限:在应用进入后台时启动后台任务,定期同步时间戳(注意iOS后台任务单次最长约3分钟)
- 结合Core Motion计步回调:步行应用可利用Core Motion的后台计步触发事件,在回调中更新计时状态,绕过纯定时器的后台限制
3. 跨平台架构实现
- 在共享项目定义
IWalkTimer接口,包含Start()、Pause()、Resume()、GetTotalSeconds()方法 - Android和iOS项目分别实现该接口,处理各自平台的后台逻辑
- ViewModel中注入
IWalkTimer,调用接口方法更新UI,无需关心平台差异
内容的提问来源于stack exchange,提问作者Billy Martin
相关产品推荐
相关产品推荐

