DEV Community

lyc233333
lyc233333

Posted on

鸿蒙后台任务:短时与长时的「时间管理」法则⏳

嗨~我是小L!在鸿蒙开发里,后台任务就像「时间管家」——短时任务处理紧急小事,长时任务搞定持久工作。今天带你快速搞懂两者的区别和实战技巧~

一、短时任务:后台的「加急快件」🚚

适用场景

  • 紧急但耗时短:保存临时数据、发送即时消息、短时网络请求
  • 典型例子
    • 退出应用前快速保存未提交的表单
    • 后台同步一次用户设置变更

申请「三要素」

  1. 时机:必须在前台或onBackground回调中申请
  2. 数量:同一时刻最多3个,避免「堵车」
  3. 时长
    • 普通场景:单次最长3分钟
    • 低电量:强制缩短至1分钟
    • 每日总配额:默认10分钟

实战代码(申请+超时处理)

import { backgroundTaskManager } from '@ohos.backgroundTaskManager';  

// 申请短时任务  
function requestShortTask() {  
  const requestId = backgroundTaskManager.requestSuspendDelay(  
    'sync-user-settings', // 任务原因(必填)  
    () => {  
      // 超时前回调:清理现场  
      console.log('任务即将超时,取消任务');  
      backgroundTaskManager.cancelSuspendDelay(requestId);  
    }  
  );  

  // 检查剩余时间  
  backgroundTaskManager.getRemainingDelayTime(requestId).then(res => {  
    console.log(`剩余时间:${res}秒`);  
  });  
}  
Enter fullscreen mode Exit fullscreen mode

注意事项⚠️

  • 主动取消:任务完成后必须调用cancelSuspendDelay释放配额
  • 配额消耗:仅后台运行时计时,前台运行不扣时间

二、长时任务:后台的「持久工作者」🏃

适用场景

  • 需持续运行:音乐播放、导航、设备连接、实时数据采集
  • 典型例子
    • 跑步App持续记录运动轨迹
    • 在线音乐App后台播放歌曲

实现「四步曲」

  1. 创建承载能力:新建ContinuousTaskExtensionAbility
// MyContinuousTask.ts  
import { ContinuousTaskExtensionAbility } from '@ohos.app.ability';  

export default class MyContinuousTask extends ContinuousTaskExtensionAbility {  
  onContinuousTaskStart(workInfo) {  
    // 任务启动:初始化资源  
    this.startLocationTracking();  
  }  

  onContinuousTaskStop(workInfo) {  
    // 任务停止:释放资源  
    this.stopLocationTracking();  
  }  
}  
Enter fullscreen mode Exit fullscreen mode
  1. 配置模块文件:在module.json5声明
{  
  "abilities": [  
    {  
      "name": ".MyContinuousTask",  
      "type": "extension",  
      "extension": {  
        "ability": "continuousTask"  
      }  
    }  
  ]  
}  
Enter fullscreen mode Exit fullscreen mode
  1. 启动任务:在需要的地方调用
import { backgroundTaskManager } from '@ohos.backgroundTaskManager';  

function startLongTask() {  
  const taskId = backgroundTaskManager.startContinuousTask({  
    abilityName: 'MyContinuousTask',  
    bundleName: 'com.example.myapp'  
  });  
  console.log(`长时任务启动,ID:${taskId}`);  
}  
Enter fullscreen mode Exit fullscreen mode
  1. 设置超时(避免「赖着不走」)
onContinuousTaskStart(workInfo) {  
  // 设置5分钟超时  
  setTimeout(() => {  
    backgroundTaskManager.stopContinuousTask(this.taskId); // 主动停止  
  }, 5 * 60 * 1000);  
}  
Enter fullscreen mode Exit fullscreen mode

三、核心差异对比表📊

维度 短时任务 长时任务
生命周期 最长3分钟(低电量1分钟) 需主动停止或设置超时
启动方式 requestSuspendDelay startContinuousTask
资源消耗 轻量级(单任务单线程) 可申请更多资源(如后台定位)
用户感知 无明显提示 状态栏显示「后台运行」图标
典型场景 临时同步、快速计算 音乐播放、导航跟踪

四、资源管理「黄金法则」

1. 短时任务:省着用!

  • 合并同类任务:避免多次申请(如批量提交数据)
  • 优先前台处理:能在前台完成的绝不拖到后台

2. 长时任务:用完即止!

  • 明确超时时间:避免忘记停止导致「内存泄漏」
  • 监听电量变化:低电量时自动降级为短时任务
import { batteryManager } from '@ohos.battery';  

batteryManager.on('levelChanged', (level) => {  
  if (level < 20 && this.isLongTaskRunning) {  
    backgroundTaskManager.stopContinuousTask(this.taskId); // 停止长时任务  
    this.requestShortTask(); // 改用短时任务处理紧急部分  
  }  
});  
Enter fullscreen mode Exit fullscreen mode

3. 通用禁忌⚠️

  • ❌ 短时任务里做复杂计算(如图片压缩)
  • ❌ 长时任务不设置超时(可能被系统强杀)
  • ✅ 所有任务结束后清理资源(如关闭文件句柄、取消网络请求)

五、实战场景:运动App的任务选择⚽

场景描述

  • 用户启动跑步模式后,App需持续记录位置(长时任务)
  • 跑步过程中,每5分钟自动保存一次运动数据(短时任务)

实现逻辑

  1. 长时任务

    • 启动定位服务,实时获取经纬度
    • 设置超时:用户结束跑步或手动停止时关闭
  2. 短时任务

    • 每5分钟触发一次,后台保存数据到本地数据库
    • 使用requestSuspendDelay申请1分钟配额完成保存

总结:任务选择「三字诀」

  • :紧急、轻量、限时(用短时)
  • :持久、连续、需状态(用长时)
  • :珍惜配额,避免资源浪费

Top comments (0)