【每日学点鸿蒙知识】长时任务、HarmonyAppProvision申请、preferences、Testing工具、应用保活

1、HarmonyOS 如何解决语音聊天、通信app退后台系统采集播放回调就会停止,回前台未恢复?

关于应用切到后台系统采集播放回调停止的问题原因如下:为了降低设备耗电速度、保障用户使用流畅度,系统会对退至后台的应用进行管控,包括进程挂起(即系统不再为应用进程分配CPU资源,同时对应的公共事件等不再发给应用进程)和进程终止。

建议采用 后台任务开发服务 中的 长时任务,在页面的 onPageHide生命周期中申请长时任务,并在onPageShow取消长时任务,可以采用 backgroundTaskManager.startBackgroundRunning 接口来申请长时任务。

Stage模型中示例代码:

  1. 需要申请ohos.permission.KEEP_BACKGROUND_RUNNING权限,配置方式请参见声明权限

  2. 声明后台模式类型。在module.json5配置文件中为需要使用长时任务的UIAbility声明相应的长时任务类型(配置文件中填写长时任务类型的配置项)。

    "module": {
    "abilities": [
    {
    "backgroundModes": [
    // 长时任务类型的配置项
    "audioRecording"
    ],
    }
    ],
    ...
    }

  3. 导入模块。长时任务相关的模块为@ohos.resourceschedule.backgroundTaskManager@ohos.app.ability.wantAgent,其余模块按实际需要导入。

    import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager';
    import UIAbility from '@ohos.app.ability.UIAbility';
    import window from '@ohos.window';
    import AbilityConstant from '@ohos.app.ability.AbilityConstant';
    import Want from '@ohos.app.ability.Want';
    import rpc from '@ohos.rpc';
    import { BusinessError } from '@ohos.base';
    import wantAgent, { WantAgent } from '@ohos.app.ability.wantAgent';

  4. 申请和取消长时任务。

    • 在Stage模型中,长时任务支持设备本应用申请,持跨设备或跨应用的申请仅对系统应用开放。设备本应用申请长时任务示例代码如下:

      @Entry
      @Component
      struct Index {
      @State message: string = 'ContinuousTask';
      // 通过getContext方法,来获取page所在的UIAbility上下文。
      private context: Context = getContext(this);

      startContinuousTask() {
      let wantAgentInfo: wantAgent.WantAgentInfo = {
      // 点击通知后,将要执行的动作列表
      // 添加需要被拉起应用的bundleName和abilityName
      wants: [
      {
      bundleName: "com.example.myapplication",
      abilityName: "com.example.myapplication.MainAbility"
      }
      ],
      // 指定点击通知栏消息后的动作是拉起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(this.context,
           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(this.context).then(() => {
      console.info(Succeeded in operationing stopBackgroundRunning.);
      }).catch((err: BusinessError) => {
      console.error(Failed to operation stopBackgroundRunning. Code is ${err.code}, message is ${err.message});
      });
      }

      build() {
      Row() {
      Column() {
      Text("Index")
      .fontSize(50)
      .fontWeight(FontWeight.Bold)

      复制代码
         Button() {
            Text('申请长时任务').fontSize(25).fontWeight(FontWeight.Bold)
          }
          .type(ButtonType.Capsule)
          .margin({ top: 10 })
          .backgroundColor('#0D9FFB')
          .width(250)
          .height(40)
          .onClick(() => {
            // 通过按钮申请长时任务
            this.startContinuousTask();
      
            // 此处执行具体的长时任务逻辑,如放音等。
          })
      
          Button() {
            Text('取消长时任务').fontSize(25).fontWeight(FontWeight.Bold)
          }
          .type(ButtonType.Capsule)
          .margin({ top: 10 })
          .backgroundColor('#0D9FFB')
          .width(250)
          .height(40)
          .onClick(() => {
            // 此处结束具体的长时任务的执行
      
            // 通过按钮取消长时任务
            this.stopContinuousTask();
          })
        }
        .width('100%')
      }
      .height('100%')

      }
      }

2、HarmonyOS HarmonyAppProvision信息申请后依然无权限?

3、HarmonyOS preferences存储的数据大于最大长度之后,建议使用什么来存储呢?

可使用键值型数据库----单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4 MB。

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-kv-store-V5

4、使用Deveco Testing工具时,如何在进行APP性能测试的同时检测APPCPU和GPU的功耗状态?

目前可以通过"性能功耗测试/场景化性能测试"检测

5、HarmonyOS 关于应用保活问题?

  1. 申请后台任务 一个app只需要申请一个吗?比如app在某几个页面时,app后台,需要后台任务保活,使用一个就可以?还是说每个都需要单独申请呢?
  2. 还有就是后台保活的api是哪个?

解答:

  1. 同一时刻可以申请一个或者多个类型的长时任务,存在多类型业务时,只需要申请主业务类型长时任务。只要主申请的任务存在,应用就不会被冻结
  2. 后台长时任务,参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/continuous-task-V5

长时任务申请约束与限制

  • 申请限制:Stage模型中,长时任务仅支持UIAbility申请;FA模型中,长时任务仅支持ServiceAbility申请。
  • 数量限制:一个UIAbility(FA模型则为ServiceAbility)同一时刻仅支持申请一个长时任务,即在一个长时任务结束后才可能继续申请。如果一个应用同时需要申请多个长时任务,需要创建多个UIAbility;一个应用的一个UIAbility申请长时任务后,整个应用下的所有进程均不会被挂起。
  • 运行限制 :在手机产品上,系统会进行长时任务校验。
    场景1:若应用申请了长时任务,但未真正执行申请类型的长时任务或申请类型的任务已结束,系统会对应用进行管控。例如系统检测到应用申请了AUDIO_PLAYBACK(音视频播放),但实际未播放音乐,长时任务会被取消。
    场景2:若应用没有申请对应的长时任务类型,但执行了相关类型的长时任务,系统会对应用进行管控。例如系统检测到应用只申请了AUDIO_PLAYBACK(音视频播放),但实际上除了播放音乐(对应AUDIO_PLAYBACK类型),还在进行录制(对应AUDIO_RECORDING类型),系统会对应用进行管控。
    场景3:若运行长时任务的进程后台负载持续高于所申请类型的典型负载,系统会对应用进行管控。
相关推荐
一只栖枝6 小时前
华为 HCIE 大数据认证中 Linux 命令行的运用及价值
大数据·linux·运维·华为·华为认证·hcie·it
zhanshuo10 小时前
在鸿蒙里优雅地处理网络错误:从 Demo 到实战案例
harmonyos
zhanshuo10 小时前
在鸿蒙中实现深色/浅色模式切换:从原理到可运行 Demo
harmonyos
whysqwhw16 小时前
鸿蒙分布式投屏
harmonyos
whysqwhw17 小时前
鸿蒙AVSession Kit
harmonyos
whysqwhw19 小时前
鸿蒙各种生命周期
harmonyos
whysqwhw20 小时前
鸿蒙音频编码
harmonyos
whysqwhw20 小时前
鸿蒙音频解码
harmonyos
whysqwhw20 小时前
鸿蒙视频解码
harmonyos
whysqwhw20 小时前
鸿蒙视频编码
harmonyos