
回复
嗨~我是小L!在鸿蒙开发里,后台任务就像「时间管家」——短时任务处理紧急小事,长时任务搞定持久工作。今天带你快速搞懂两者的区别和实战技巧~
onBackground
回调中申请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}秒`);
});
}
cancelSuspendDelay
释放配额ContinuousTaskExtensionAbility
onContinuousTaskStop(workInfo) {
// 任务停止:释放资源
this.stopLocationTracking();
}
}
2. **配置模块文件**:在`module.json5`声明
3. ```json
4. {
5. "abilities": [
6. {
7. "name": ".MyContinuousTask",
8. "type": "extension",
9. "extension": {
10. "ability": "continuousTask"
11. }
12. }
13. ]
14. }
15. ```
3. **启动任务**:在需要的地方调用
4. ```typescript
5. import { backgroundTaskManager } from '@ohos.backgroundTaskManager';
function startLongTask() {
const taskId = backgroundTaskManager.startContinuousTask({
abilityName: 'MyContinuousTask',
bundleName: 'com.example.myapp'
});
console.log(`长时任务启动,ID:${taskId}`);
}
backgroundTaskManager.stopContinuousTask(this.taskId); // 主动停止
维度 | 短时任务 | 长时任务 |
---|---|---|
生命周期 | 最长3分钟(低电量1分钟) | 需主动停止或设置超时 |
启动方式 | requestSuspendDelay |
startContinuousTask |
资源消耗 | 轻量级(单任务单线程) | 可申请更多资源(如后台定位) |
用户感知 | 无明显提示 | 状态栏显示「后台运行」图标 |
典型场景 | 临时同步、快速计算 | 音乐播放、导航跟踪 |
### 3. 通用禁忌⚠️
- ❌ 短时任务里做复杂计算(如图片压缩)
- - ❌ 长时任务不设置超时(可能被系统强杀)
- - ✅ 所有任务结束后清理资源(如关闭文件句柄、取消网络请求)
## 五、实战场景:运动App的任务选择⚽
### 场景描述
- 用户启动跑步模式后,App需持续记录位置(长时任务)
- - 跑步过程中,每5分钟自动保存一次运动数据(短时任务)
### 实现逻辑
1. **长时任务**:
2. - 启动定位服务,实时获取经纬度
3. - 设置超时:用户结束跑步或手动停止时关闭
2. **短时任务**:
3. - 每5分钟触发一次,后台保存数据到本地数据库
4. - 使用`requestSuspendDelay`申请1分钟配额完成保存
## 总结:任务选择「三字诀」
- **短**:紧急、轻量、限时(用短时)
- - **长**:持久、连续、需状态(用长时)
- - **省**:珍惜配额,避免资源浪费