HarmonyOS 鸿蒙Next backgroundTaskManager 相关问题咨询

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next backgroundTaskManager 相关问题咨询

咨询描述:
1. backgroundTaskManager中的DATA_TRANSFER类型,是否包含后台文件上传,举例仅提到了文件下载。
2. 官方文档建议在backgroundTaskManager中startBackgroundRunning的回调中执行长时任务,这里的逻辑是某个任务一开始(当应用还处于前台时)就在这里执行,还是需要等到切换到后台才在这里执行?(目前理解如果backgroundTaskManager的作用是为了应用在后台因为长时任务而不被挂起,应该是任务一开始就在这里执行)。
3. 请简单说明一下backgroundTaskManager中updateBackgroundRunning方法的应用场景。目前来看长时任务在后台需要更新进度,但似乎是通过notificationManager进行通知的更新,因此不清楚updateBackgroundRunning的作用。

参考文档地址:
1. https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-resourceschedule-backgroundtaskmanager-V13#backgroundtaskmanagerstartbackgroundrunning12
2. https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/continuous-task-V13 


更多关于HarmonyOS 鸿蒙Next backgroundTaskManager 相关问题咨询的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

1.目前网络管理服务(kit.NetworkKit)和上传下载(ohos.request)支持长时任务 2.在startBackgroundRunning回调中执行

3.update使用方式可参考:

如果应用想先后申请多种不同类型的长时任务只能使用start+update模式

目前停止长时任务只能使用stop,会把应用所有的长时任务全部停止掉(已经给系统提供需求支持单一类型的停止),目前只能是stop+start的方式保证业务体验联系性

抽象一个基础能力,不耦合业务来实现不同类型的长时任务动态管理

/*

* Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.

*/

import { backgroundTaskManager } from '@kit.BackgroundTasksKit'

import WantAgent from '@ohos.app.ability.wantAgent';

import { BusinessError } from '@kit.BasicServicesKit'

import { BackgroundMode } from './BackgroundMode'

import { MusicApp } from '../global/globalmodel/GlobalModel'

import { createOrGet, globalKeys } from '../global/GlobalThisHelper'

import { Logger } from './Logger'

const logger = new Logger("LastLongTaskHelper")

const ERRCODE_BGTASK_EXISTS = 9800005

/**

* 长时任务管理类

*/

export class LastLongTaskHelper {

private static instance?: LastLongTaskHelper

private bgModeSet = new Set<string>()

/**

* 获取唯一实例

* @returns

*/

public static getInstance(): LastLongTaskHelper {

if (!LastLongTaskHelper.instance) {

LastLongTaskHelper.instance = new LastLongTaskHelper()

}

return LastLongTaskHelper.instance

}

/**

* 开启长时任务

* @param action 类型

* @param bgMode 任务类型

* @param wantAgent

* @returns 任务的id

*/

public startBackGround(action: string, bgMode: BackgroundMode, wantAgent: object): Promise<number | undefined> {

this.bgModeSet.add(bgMode)

const app: MusicApp = createOrGet(MusicApp, globalKeys.app)

return new Promise((resolve) => {

// 只有一种类型 直接start

if (this.bgModeSet.size === 1) {

resolve(this.startBackgroundRunning(action, bgMode, wantAgent))

} else if (this.bgModeSet.size > 1) {

// 如果有多种类型时 audio和mul 不共存

if (bgMode === BackgroundMode.AUDIO) {

this.bgModeSet.delete(BackgroundMode.MULTI_DEVICE_CONNECTION)

} else if (bgMode === BackgroundMode.MULTI_DEVICE_CONNECTION) {

this.bgModeSet.delete(BackgroundMode.AUDIO)

}

// 超过两个时进行更新

backgroundTaskManager.updateBackgroundRunning(app.abilityContext, Array.from(this.bgModeSet))

.then((res: backgroundTaskManager.ContinuousTaskNotification) => {

let resId = res.notificationId

logger.info(`${action},Operation updateBackgroundRunning succeeded, ${JSON.stringify(this.bgModeSet)}, resId ${resId}`)

resolve(resId)

}).catch((error: BusinessError) => {

logger.error(`${action}, Operation updateBackgroundRunning failed. code is ${error.code} message is ${error.message}`)

// 如果更新失败 尝试重新start

if (error.code === ERRCODE_BGTASK_EXISTS) {

resolve(this.startBackgroundRunning(action, bgMode, wantAgent))

return

}

resolve(undefined)

})

}

})

}

/**

* startBackgroundRunning

* @param action 类型

* @param bgMode 任务类型

* @param wantAgent

*/

private startBackgroundRunning(action : string, bgMode: BackgroundMode, wantAgent: object) : Promise<number | undefined> {

const app: MusicApp = createOrGet(MusicApp, globalKeys.app)

return new Promise((resolve) => {

backgroundTaskManager.startBackgroundRunning(app.abilityContext, [bgMode], wantAgent)

.then((res: backgroundTaskManager.ContinuousTaskNotification) => {

let resId = res.notificationId

logger.info(`${action},startBackgroundRunning succeeded ${bgMode}, resId ${resId}`)

resolve(resId)

})

.catch((error: BusinessError) => {

logger.error(`Operation startBackgroundRunning failed. code is ${error.code} message is ${error.message}`);

resolve(undefined)

});

})

}

/**

* 停止长时任务

* @param action 类型

* @param bgMode 任务类型

*/

public stopBackGround(action: string, bgMode: BackgroundMode): void {

this.bgModeSet.delete(bgMode)

if (this.bgModeSet.size === 0) {

const app: MusicApp = createOrGet(MusicApp, globalKeys.app)

backgroundTaskManager.stopBackgroundRunning(app.abilityContext, (err, data) => {

if (err) {

logger.warn(`${action}, stop background err ${err.stack}`)

} else {

logger.info(`${action},stop background success`)

}

})

} else if (this.bgModeSet.size > 0) {

// 如果是下载的场景要定制处理

if (bgMode === BackgroundMode.DATA_TRANSFER) {

const app: MusicApp = createOrGet(MusicApp, globalKeys.app)

backgroundTaskManager.stopBackgroundRunning(app.abilityContext, (err, data) => {

if (err) {

logger.warn(`${action}, stop background err ${err.stack}`)

} else {

logger.info(`${action},stop background success`)

}

this.reStartBackGround(BackgroundMode.DATA_TRANSFER)

})

} else {

const app: MusicApp = createOrGet(MusicApp, globalKeys.app)

backgroundTaskManager.updateBackgroundRunning(app.abilityContext, Array.from(this.bgModeSet)).then(() => {

logger.info(`${action},Operation updateBackgroundRunning succeeded, ${JSON.stringify(this.bgModeSet)}`);

}).catch((error: BusinessError) => {

logger.error(`${action}, Operation updateBackgroundRunning failed. code is ${error.code} message is ${error.message}`)

})

}

}

}

/**

* 重新开启某种类型的后台任务 先从set中移除在基于set中剩余的进行开启

* @param bgMode 待移除的类型

*/

public reStartBackGround(bgMode: BackgroundMode): void {

this.bgModeSet.delete(bgMode)

if (this.bgModeSet.has(BackgroundMode.AUDIO)) {

this.start('reStartBackGround', BackgroundMode.AUDIO)

} else if (this.bgModeSet.has(BackgroundMode.MULTI_DEVICE_CONNECTION)) {

this.start('reStartBackGround', BackgroundMode.MULTI_DEVICE_CONNECTION)

}

}

/**

* 开启任务

* @param action 类型

* @param bgMode 任务模式

*/

private start(action: string, bgMode: BackgroundMode): void {

logger.info(`${action},start background ${bgMode}`)

let wantAgentInfo: WantAgent.WantAgentInfo = {

wants: [

{

bundleName: "com.huawei.hmsapp.music",

abilityName: "MainAbility",

}

],

operationType: WantAgent.OperationType.START_ABILITY,

requestCode: 0,

wantAgentFlags: [WantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]

};

WantAgent.getWantAgent(wantAgentInfo).then((agent) => {

logger.info('getWantAgent success' + JSON.stringify(agent));

LastLongTaskHelper.getInstance().startBackGround(action, bgMode, agent)

}).catch((err: BusinessError) => {

logger.warn(`${action},setLaunchAbility fail ${err.stack}`);

})

}

}

更多关于HarmonyOS 鸿蒙Next backgroundTaskManager 相关问题咨询的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


关于HarmonyOS 鸿蒙Next backgroundTaskManager 的相关问题,以下是一些直接的技术解答:

HarmonyOS 鸿蒙Next系统中的backgroundTaskManager主要负责管理应用在后台的任务,确保系统资源的高效利用和用户体验的流畅性。

  1. 任务管理策略:backgroundTaskManager采用了智能的任务管理策略,根据应用的类型、行为以及用户的使用习惯,动态调整应用在后台的优先级和资源分配。

  2. 权限管理:应用在后台执行任务时,需要获得相应的权限。backgroundTaskManager会对这些权限进行严格的审核和管理,确保应用的行为符合用户的期望和系统的安全要求。

  3. 电量管理:为了延长设备的续航时间,backgroundTaskManager会对后台任务的电量消耗进行监控和优化,避免不必要的电量浪费。

  4. 任务挂起与恢复:当系统资源紧张或用户长时间未使用某个应用时,backgroundTaskManager会将其后台任务挂起。当用户重新使用该应用时,系统会自动恢复其后台任务。

  5. 日志记录与监控:backgroundTaskManager会记录应用的后台任务执行日志,并提供监控工具,帮助开发者了解应用的后台行为,优化应用性能。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部