HarmonyOS鸿蒙Next中BLE后台传输是否支持长时任务

HarmonyOS鸿蒙Next中BLE后台传输是否支持长时任务 长时任务类型BLUETOOTH_INTERACTION 是否支持BLE,如果不支持,有需求需要通过BLE连接时在后台也能传输数据(位置,传感器等数据),需要如何解决

3 回复

【背景知识】

应用退至后台后,在后台需要长时间运行用户可感知的任务,如蓝牙相关业务等。为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。在长时任务中,支持同时申请多种类型的任务,也可以对任务类型进行更新。应用退至后台执行业务时,系统会做一致性校验,确保应用在执行相应的长时任务。应用在申请长时任务成功后,通知栏会显示与长时任务相关联的消息,用户删除通知栏消息时,系统会自动停止长时任务。

【解决方案】

使用流程:

  1. 添加后台运行权限ohos.permission.KEEP_BACKGROUND_RUNNING。
{
  "requestPermissions": [
    {
      "name": "ohos.permission.KEEP_BACKGROUND_RUNNING"
    }
  ]
}
  1. 声明蓝牙传输后台模式类型。在module.json5文件中为需要使用长时任务的UIAbility声明相应的长时任务类型,配置文件中填写长时任务类型的配置项。
"module": {
  "abilities": [
      {
          "backgroundModes": [
           // 配置长时任务类型为蓝牙传输
          "bluetoothInteraction"
          ]
      }
  ],
  // ...
}
  1. 导入长时任务相关模块。
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { wantAgent, WantAgent } from '@kit.AbilityKit';
import { ble } from '@kit.ConnectivityKit';
  1. 申请和取消长时任务。
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数据传输。开发者可以通过BackgroundTaskManagerBackgroundMode相关API配置和管理后台任务,确保BLE连接和数据传输在后台保持活跃。具体实现需遵循鸿蒙系统的后台任务管理规范,避免资源过度消耗。

在HarmonyOS Next中,BLUETOOTH_INTERACTION长时任务类型确实支持BLE后台传输。针对您提到的后台BLE数据传输需求,可以通过以下方式实现:

  1. 首先需要申请BLUETOOTH_INTERACTION长时任务权限,在config.json中配置:
"abilities": [
  {
    "backgroundModes": ["bluetoothInteraction"]
  }
]
  1. 对于持续性的BLE数据传输,建议:
  • 使用Service Ability保持后台连接
  • 合理设置BLE连接参数(如连接间隔)
  • 采用数据分包传输机制
  1. 对于位置/传感器等实时性要求高的数据:
  • 可以结合后台位置服务能力
  • 使用Notification保持进程优先级

注意需要同时申请必要的蓝牙权限(ohos.permission.USE_BLUETOOTH等)。实际开发时建议通过模拟器或真机充分测试后台场景下的BLE稳定性。

回到顶部