HarmonyOS 鸿蒙Next backgroundTaskManager 相关问题咨询
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
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主要负责管理应用在后台的任务,确保系统资源的高效利用和用户体验的流畅性。
-
任务管理策略:backgroundTaskManager采用了智能的任务管理策略,根据应用的类型、行为以及用户的使用习惯,动态调整应用在后台的优先级和资源分配。
-
权限管理:应用在后台执行任务时,需要获得相应的权限。backgroundTaskManager会对这些权限进行严格的审核和管理,确保应用的行为符合用户的期望和系统的安全要求。
-
电量管理:为了延长设备的续航时间,backgroundTaskManager会对后台任务的电量消耗进行监控和优化,避免不必要的电量浪费。
-
任务挂起与恢复:当系统资源紧张或用户长时间未使用某个应用时,backgroundTaskManager会将其后台任务挂起。当用户重新使用该应用时,系统会自动恢复其后台任务。
-
日志记录与监控:backgroundTaskManager会记录应用的后台任务执行日志,并提供监控工具,帮助开发者了解应用的后台行为,优化应用性能。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html