You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:26:05