【每日学点鸿蒙知识】长时任务、profiler allocation、事件订阅、getTagInfo、NativeWindow
1、HarmonyOS长时任务报错?
按照官方文档开启长时任务:
startContinuousTask() {
let wantAgentInfo: wantAgent.WantAgentInfo = {
// 点击通知后,将要执行的动作列表
// 添加需要被拉起应用的bundleName和abilityName
wants: [
{
bundleName: "com.xxxx.xxxx.news",
abilityName: "com.xxxx.xxxx.news.EntryAbility"
}
],
// 指定点击通知栏消息后的动作是拉起ability
actionType: wantAgent.OperationType.START_ABILITY,
// 使用者自定义的一个私有值
requestCode: 0,
// 点击通知后,动作执行属性
wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
};
// 通过wantAgent模块下getWantAgent方法获取WantAgent对象
wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
backgroundTaskManager.startBackgroundRunning(getContext(),
backgroundTaskManager.BackgroundMode.AUDIO_RECORDING, wantAgentObj).then(() => {
console.info(`Succeeded in operationing startBackgroundRunning.`);
}).catch((err: BusinessError) => {
console.error(`Failed to operation startBackgroundRunning. Code is ${err.code}, message is ${err.message}`);
});
});
}
stopContinuousTask() {
backgroundTaskManager.stopBackgroundRunning(getContext()).then(() => {
console.info(`Succeeded in operationing stopBackgroundRunning.`);
}).catch((err: BusinessError) => {
console.error(`Failed to operation stopBackgroundRunning. Code is ${err.code}, message is ${err.message}`);
});
}
调用stopContinuousTask方法报错:
Failed to operation stopBackgroundRunning. Code is 9800005, message is BussinessError 9800005: Continuous Task verification failed. The application has not applied for a continuous task.
长时任务有约束和限制,其中运行限制里面,如果应用申请了长时任务,但是未真正执行申请类型的长时任务或申请类型的任务已结束,系统会对应用进行管控。
简单的说,申请完长时任务,系统会在5秒之内检测时都执行申请类型的长时任务,没有,就直接结束任务了,那再触发stopContinuousTask就会报这个错。
约束限制可参见指导:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/continuous-task-V5#%E7%BA%A6%E6%9D%9F%E4%B8%8E%E9%99%90%E5%88%B6
- 申请限制:Stage模型中,长时任务仅支持UIAbility申请;FA模型中,长时任务仅支持ServiceAbility申请。
- 数量限制:一个UIAbility(FA模型则为ServiceAbility)同一时刻仅支持申请一个长时任务,即在一个长时任务结束后才可能继续申请。如果一个应用同时需要申请多个长时任务,需要创建多个UIAbility;一个应用的一个UIAbility申请长时任务后,整个应用下的所有进程均不会被挂起。
- 运行限制:在手机产品上,系统会进行长时任务校验。
- 场景1:若应用申请了长时任务,但未真正执行申请类型的长时任务或申请类型的任务已结束,系统会对应用进行管控。例如系统检测到应用申请了AUDIO_PLAYBACK(音视频播放),但实际未播放音乐,长时任务会被取消。
- 场景2:若应用没有申请对应的长时任务类型,但执行了相关类型的长时任务,系统会对应用进行管控。例如系统检测到应用只申请了AUDIO_PLAYBACK(音视频播放),但实际上除了播放音乐(对应AUDIO_PLAYBACK类型),还在进行录制(对应AUDIO_RECORDING类型),系统会对应用进行管控。
- 场景3:若运行长时任务的进程后台负载持续高于所申请类型的典型负载,系统会对应用进行管控。
2、profiler allocation 缺少ArkTS Allocation泳道?
profiler allocation 缺少ArkTS Allocation泳道(只有Memory和Native Allocation)
ArkTS Allocation泳道需要在Snapshot模板中勾选,Snapshot是分析ArkTS内存泄漏,allocation 是分析native内存泄漏。
3、HarmonyOS 多个页面订阅同一事件,上个页面销毁后取消订阅会影响其他页的事件?
emitter使用方法参考如下:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-emitter-V5
需要注意:on中增加的callback 和 off 中的callback需要是同一个,否则会把所有的订阅都取消。
4、HarmonyOS APP调用NFC,getTagInfo报错?
首先申明want:
let want: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.wht_app',
abilityName: 'EntryAbility',
moduleName: 'entry' // moduleName非必选
};
然后调用getTagInfo
try {
tagInfo = tag.getTagInfo(want);
} catch (error) {
console.log('手机NFC功能报错', "tag.getTagInfo catched error: " + error)
}
真机运行报错: tag.getTagInfo catched error: Error: Parameter error. The parameter number is invalid.
根据官方文档看参数Want需在分发Ability时,在系统onCreate入口函数的参数中获取。
官方指南可以参考一下:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/nfc-tag-access-guide-V5
5、HarmonyOS关于NativeWindow的创建和销毁?
NativeWindow注册完回调后,何时触发OnSurfaceCreated、何时触发OnSurfaceDestroyed,如何主动触发该回调
参考链接如下:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/_o_h___native_x_component-V5#onsurfacecreated