文章目录
- 背景
- 一、BackgroundTaskMode 枚举概述
- 二、10 种模式全解析
- 模式 1:DATA_TRANSFER — 数据传输
- 模式 2:AUDIO_PLAYBACK — 音视频播放
- 模式 3:AUDIO_RECORDING — 录音录屏
- 模式 4:LOCATION — 定位导航
- 模式 5:BLUETOOTH_INTERACTION — 蓝牙业务
- 模式 6:MULTI_DEVICE_CONNECTION — 多设备互联
- 模式 7:VOIP — 音视频通话
- 模式 8:TASK_KEEPING — 计算任务
- 模式 9:AV_PLAYBACK_AND_RECORD — 多媒体业务
- 模式 10:SPECIAL_SCENARIO_PROCESSING — 特殊场景
- 三、模式对照速查表
- 四、模式转换的内部实现
- 五、Demo 中的模式选择 UI
- 六、多模式组合申请
- 七、常见选型错误
- 八、小结
背景
近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦
案例demo导航展示
↓↓↓↓↓↓接下来言归正传 ↓↓↓↓
一、BackgroundTaskMode 枚举概述
HarmonyOS 将后台长时任务划分为10 种模式,每种模式对应不同的业务场景。系统会校验申请的模式是否与实际业务匹配,不匹配会导致申请失败。
因此,正确选择BackgroundTaskMode是使用长时任务的首要前提。
二、10 种模式全解析
模式 1:DATA_TRANSFER — 数据传输
backgroundTaskManager.BackgroundTaskMode.MODE_DATA_TRANSFER// 内部字符串:"dataTransfer"适用场景:
- 后台下载大文件(视频、安装包、文档)
- 后台上传本地文件到云端
- 后台数据同步(通讯录、相册备份)
特点:最常见的后台任务模式,只要涉及大量数据的上传/下载,优先选择此模式。
模式 2:AUDIO_PLAYBACK — 音视频播放
backgroundTaskManager.BackgroundTaskMode.MODE_AUDIO_PLAYBACK// 内部字符串:"audioPlayback"适用场景:
- 音乐播放器后台播放
- 播客/有声书应用
- 视频流媒体的音频部分
特点:选择此模式后,系统允许 App 持续占用音频焦点,通知栏通常会显示播放控制。
模式 3:AUDIO_RECORDING — 录音录屏
backgroundTaskManager.BackgroundTaskMode.MODE_AUDIO_RECORDING// 内部字符串:"audioRecording"适用场景:
- 后台录音(会议记录、语音笔记)
- 屏幕录制
特点:涉及麦克风或屏幕录制,选此模式。注意:持续录制会消耗较多资源和电量。
模式 4:LOCATION — 定位导航
backgroundTaskManager.BackgroundTaskMode.MODE_LOCATION// 内部字符串:"location"适用场景:
- 地图导航 App(后台持续更新位置)
- 运动轨迹记录(跑步、骑行)
- 打车/快递跟踪
特点:需要持续获取 GPS/网络位置,是导航类 App 的标配模式。
模式 5:BLUETOOTH_INTERACTION — 蓝牙业务
backgroundTaskManager.BackgroundTaskMode.MODE_BLUETOOTH_INTERACTION// 内部字符串:"bluetoothInteraction"适用场景:
- 蓝牙耳机/音箱的连接维持
- 蓝牙健康设备数据同步(手环、血压计)
- BLE 低功耗设备后台通信
特点:凡涉及蓝牙的持续交互,均应选择此模式。
模式 6:MULTI_DEVICE_CONNECTION — 多设备互联
backgroundTaskManager.BackgroundTaskMode.MODE_MULTI_DEVICE_CONNECTION// 内部字符串:"multiDeviceConnection"适用场景:
- 华为设备之间的跨设备协同(手机与平板的流转)
- 分布式数据同步
- 多设备发现与连接管理
特点:HarmonyOS 的核心能力之一,分布式场景专用。
模式 7:VOIP — 音视频通话
backgroundTaskManager.BackgroundTaskMode.MODE_VOIP// 内部字符串:"voip"适用场景:
- 微信/企业微信视频通话
- 第三方 VoIP 应用(WhatsApp、Zoom)
- 直播连麦
特点:通话进行时应用切到后台仍需保持连接,必须使用此模式。
模式 8:TASK_KEEPING — 计算任务
backgroundTaskManager.BackgroundTaskMode.MODE_TASK_KEEPING// 内部字符串:"taskKeeping"适用场景:
- 后台持续计算(AI 推理、图像处理)
- 后台运行脚本或算法
- 演示/测试场景(最容易申请通过)
特点:这是最"通用"的模式,适合不属于以上专项场景但确实需要后台运行的计算密集型任务。BgTaskDemoPage 中默认选中此模式正是出于此原因。
模式 9:AV_PLAYBACK_AND_RECORD — 多媒体业务
backgroundTaskManager.BackgroundTaskMode.MODE_AV_PLAYBACK_AND_RECORD// 内部字符串:"avPlaybackAndRecord"适用场景:
- 同时进行音视频播放和录制
- 直播推流(边推流边监听回放)
- 视频通话录制
特点:相当于AUDIO_PLAYBACK和AUDIO_RECORDING的组合场景。
模式 10:SPECIAL_SCENARIO_PROCESSING — 特殊场景
backgroundTaskManager.BackgroundTaskMode.MODE_SPECIAL_SCENARIO_PROCESSING// 内部字符串:"specialScenarioProcessing"适用场景:
- 特殊行业应用(金融、医疗等需要持续后台处理)
- 其他不属于以上类别的特殊场景
特点:作为兜底模式,审核门槛较高,需提供充分的业务说明。
三、模式对照速查表
| 枚举值 | 内部字符串 | 典型场景 |
|---|---|---|
MODE_DATA_TRANSFER | dataTransfer | 下载/上传文件 |
MODE_AUDIO_PLAYBACK | audioPlayback | 后台音乐播放 |
MODE_AUDIO_RECORDING | audioRecording | 录音/录屏 |
MODE_LOCATION | location | 导航/轨迹记录 |
MODE_BLUETOOTH_INTERACTION | bluetoothInteraction | 蓝牙设备通信 |
MODE_MULTI_DEVICE_CONNECTION | multiDeviceConnection | 多设备协同 |
MODE_VOIP | voip | VoIP 通话 |
MODE_TASK_KEEPING | taskKeeping | 计算任务/通用后台 |
MODE_AV_PLAYBACK_AND_RECORD | avPlaybackAndRecord | 直播/录制+播放 |
MODE_SPECIAL_SCENARIO_PROCESSING | specialScenarioProcessing | 特殊行业场景 |
四、模式转换的内部实现
BgTaskUtil内部通过convertTaskMode方法将枚举值转为字符串:
privatestaticconvertTaskMode(backgroundTaskMode:backgroundTaskManager.BackgroundTaskMode):string{if(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_DATA_TRANSFER){return"dataTransfer";//数据传输。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_AUDIO_PLAYBACK){return"audioPlayback";//音视频播放。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_AUDIO_RECORDING){return"audioRecording";//录音、录屏。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_LOCATION){return"location";//定位导航。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_BLUETOOTH_INTERACTION){return"bluetoothInteraction";//蓝牙相关业务。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_MULTI_DEVICE_CONNECTION){return"multiDeviceConnection";//多设备互联。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_VOIP){return"voip";//音视频通话。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_TASK_KEEPING){return"taskKeeping";//计算任务。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_AV_PLAYBACK_AND_RECORD){return"avPlaybackAndRecord";//多媒体相关业务。}elseif(backgroundTaskMode===backgroundTaskManager.BackgroundTaskMode.MODE_SPECIAL_SCENARIO_PROCESSING){return"specialScenarioProcessing";//特殊场景类型}else{return"";}}这就是为什么开发者只需传入枚举值,不需要记住背后的字符串值。
五、Demo 中的模式选择 UI
Demo 页面通过复选网格展示所有 10 种模式,用户可以多选:
@Statemodes:BgModeItem[]=[{label:'📡 数据传输',mode:backgroundTaskManager.BackgroundTaskMode.MODE_DATA_TRANSFER,desc:'下载/上传',selected:false},{label:'🎵 音视频播放',mode:backgroundTaskManager.BackgroundTaskMode.MODE_AUDIO_PLAYBACK,desc:'后台音乐',selected:false},{label:'🎙️ 录音录屏',mode:backgroundTaskManager.BackgroundTaskMode.MODE_AUDIO_RECORDING,desc:'后台录制',selected:false},{label:'📍 定位导航',mode:backgroundTaskManager.BackgroundTaskMode.MODE_LOCATION,desc:'导航定位',selected:false},{label:'🔵 蓝牙业务',mode:backgroundTaskManager.BackgroundTaskMode.MODE_BLUETOOTH_INTERACTION,desc:'蓝牙数据传输',selected:false},{label:'🔗 多设备互联',mode:backgroundTaskManager.BackgroundTaskMode.MODE_MULTI_DEVICE_CONNECTION,desc:'设备发现/连接',selected:false},{label:'📞 音视频通话',mode:backgroundTaskManager.BackgroundTaskMode.MODE_VOIP,desc:'VoIP通话',selected:false},{label:'⚙️ 计算任务',mode:backgroundTaskManager.BackgroundTaskMode.MODE_TASK_KEEPING,desc:'后台计算',selected:true},{label:'🎬 多媒体业务',mode:backgroundTaskManager.BackgroundTaskMode.MODE_AV_PLAYBACK_AND_RECORD,desc:'音视频处理',selected:false},{label:'⚡ 特殊场景',mode:backgroundTaskManager.BackgroundTaskMode.MODE_SPECIAL_SCENARIO_PROCESSING,desc:'特殊场景',selected:false},];UI 渲染部分:
Flex({wrap:FlexWrap.Wrap}){ForEach(this.modes,(item:BgModeItem)=>{Column(){Text(item.label).fontSize(12).fontColor(item.selected?'#FFF':'#555').fontWeight(FontWeight.Medium)Text(item.desc).fontSize(10).fontColor(item.selected?'rgba(255,255,255,0.7)':'#AAA').margin({top:2})}.width('47%').padding({top:10,bottom:10}).backgroundColor(item.selected?'#4080FF':'#F5F6FA').borderRadius(8).border({width:1,color:item.selected?'#4080FF':'#E0E0E0'}).margin({right:6,bottom:6}).onClick(()=>{item.selected=!item.selected;this.modes=[...this.modes];this.updateCanStart();})},(item:BgModeItem)=>item.label)}点击模式卡片,背景色在蓝色(已选)和灰色(未选)之间切换,选中至少一种模式后"启动"按钮才可用。
六、多模式组合申请
一次startBackgroundRunning调用可以传入多个模式:
constrequest:TaskRequest={backgroundTaskModes:[backgroundTaskManager.BackgroundTaskMode.MODE_AUDIO_PLAYBACK,backgroundTaskManager.BackgroundTaskMode.MODE_DATA_TRANSFER,],combinedTaskNotification:false,};constnotification=awaitBgTaskUtil.startBackgroundRunning(request);这相当于同时申请"音视频播放"和"数据传输"两种后台权限,适合音乐播放 App 同时需要下载歌曲的场景。
七、常见选型错误
| 错误做法 | 正确做法 |
|---|---|
导航 App 选TASK_KEEPING | 应选LOCATION |
音乐播放选TASK_KEEPING | 应选AUDIO_PLAYBACK |
视频通话选DATA_TRANSFER | 应选VOIP |
| 随意选多个模式凑数 | 仅选与实际业务匹配的模式 |
系统的校验很严格:如果你的 App 没有相关硬件能力(如没有定位权限却申请LOCATION模式),申请会被拒绝。
八、小结
选择BackgroundTaskMode的核心原则是**“业务是什么,就选什么”**:
- 下载/上传 →
DATA_TRANSFER - 播放音乐 →
AUDIO_PLAYBACK - 录音 →
AUDIO_RECORDING - 导航定位 →
LOCATION - 蓝牙通信 →
BLUETOOTH_INTERACTION - 多设备协同 →
MULTI_DEVICE_CONNECTION - VoIP 通话 →
VOIP - 计算/通用 →
TASK_KEEPING - 直播推流 →
AV_PLAYBACK_AND_RECORD - 特殊行业 →
SPECIAL_SCENARIO_PROCESSING
选对模式,后台任务才能顺利申请并通过审核。