HarmonyOS鸿蒙Next中BLE后台传输是否支持长时任务
HarmonyOS鸿蒙Next中BLE后台传输是否支持长时任务 长时任务类型BLUETOOTH_INTERACTION 是否支持BLE,如果不支持,有需求需要通过BLE连接时在后台也能传输数据(位置,传感器等数据),需要如何解决
3 回复
【背景知识】
应用退至后台后,在后台需要长时间运行用户可感知的任务,如蓝牙相关业务等。为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。在长时任务中,支持同时申请多种类型的任务,也可以对任务类型进行更新。应用退至后台执行业务时,系统会做一致性校验,确保应用在执行相应的长时任务。应用在申请长时任务成功后,通知栏会显示与长时任务相关联的消息,用户删除通知栏消息时,系统会自动停止长时任务。
【解决方案】
使用流程:
- 添加后台运行权限ohos.permission.KEEP_BACKGROUND_RUNNING。
{
"requestPermissions": [
{
"name": "ohos.permission.KEEP_BACKGROUND_RUNNING"
}
]
}
- 声明蓝牙传输后台模式类型。在module.json5文件中为需要使用长时任务的UIAbility声明相应的长时任务类型,配置文件中填写长时任务类型的配置项。
"module": {
"abilities": [
{
"backgroundModes": [
// 配置长时任务类型为蓝牙传输
"bluetoothInteraction"
]
}
],
// ...
}
- 导入长时任务相关模块。
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { wantAgent, WantAgent } from '@kit.AbilityKit';
import { ble } from '@kit.ConnectivityKit';
- 申请和取消长时任务。
import { bundleManager, wantAgent } from '@kit.AbilityKit'
import { ble } from '@kit.ConnectivityKit'
import { backgroundTaskManager } from '@kit.BackgroundTasksKit'
class BackgroundRunningManager {
// 申请长时任务
async startBackgroundRunning() {
// 获取bundle应用信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 通过wantAgent模块下getWantAgent方法获取WantAgent对象
const wantAgentObj = await wantAgent.getWantAgent({
// 添加需要被拉起应用的bundleName和abilityName
wants: [{ bundleName: bundleInfo.name, abilityName: "EntryAbility" }],
// 使用者自定义的一个私有值
requestCode: 0,
actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG],
// 车钥匙长时任务子类型。只有申请bluetoothInteraction类型的长时任务,车钥匙子类型才能生效。
// 确保extraInfo参数中的Key值为backgroundTaskManager.BackgroundModeType.SUB_MODE,否则子类型不生效。
extraInfo: { [backgroundTaskManager.BackgroundModeType.SUB_MODE] : backgroundTaskManager.BackgroundSubMode.CAR_KEY }
})
// 创建类型为BLUETOOTH_INTERACTION的后台任务
await backgroundTaskManager.startBackgroundRunning(context,backgroundTaskManager.BackgroundMode.BLUETOOTH_INTERACTION, wantAgentObj)
}
// 停止后台任务
async stopBackgroundRunning() {
backgroundTaskManager.stopBackgroundRunning(getContext())
}
}
调用方式。
- 在startBackgroundRunning回调中执行。
backgroundTaskManager.startBackgroundRunning(this.context, backgroundTaskManager.BackgroundMode.BLUETOOTH_INTERACTION, wantAgentObj).then((res: backgroundTaskManager.ContinuousTaskNotification) => {
console.info("Operation startBackgroundRunning succeeded")
// 此处执行具体的蓝牙业务逻辑。
}).catch((error: BusinessError) => {
console.error(`Failed to Operation startBackgroundRunning. code is ${error.code} message is ${error.message}`)
});
- 在执行蓝牙业务逻辑之前执行startBackgroundRunning。
// 执行封装好的长时任务方法
this.startContinuousTask()
// 执行蓝牙相关业务逻辑
ble.startBLEScan()
注意事项:
- 车钥匙长时任务子类型。只有申请bluetoothInteraction类型的长时任务,车钥匙子类型才能生效。
- 确保extraInfo参数中的Key值为backgroundTaskManager.BackgroundModeType.SUB_MODE,否则子类型不生效。
- 如果使用钱包拉起宿主应用长时任务,在执行backgroundTaskManager.startBackgroundRunning时,需要注意参数context是否能获取到。如果获取不到,可以在宿主应用启动时先缓存context。
- 开启蓝牙后台长时任务时,若蓝牙连接断开需在一分钟内重新连接成功,否则长时任务将自动结束。
更多关于HarmonyOS鸿蒙Next中BLE后台传输是否支持长时任务的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS鸿蒙Next中BLE后台传输支持长时任务。系统提供了后台任务管理机制,允许应用在后台持续进行BLE数据传输。开发者可以通过BackgroundTaskManager
和BackgroundMode
相关API配置和管理后台任务,确保BLE连接和数据传输在后台保持活跃。具体实现需遵循鸿蒙系统的后台任务管理规范,避免资源过度消耗。