【每日学点鸿蒙知识】长时任务、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:若运行长时任务的进程后台负载持续高于所申请类型的典型负载,系统会对应用进行管控。
相关推荐
轻口味1 小时前
【每日学点鸿蒙知识】查看触摸热区范围、直接赋值到剪贴板、组件截图、横竖屏切换、防截图等
华为·harmonyos
轻口味1 小时前
【每日学点鸿蒙知识】Video播放失败、toggle拖拽、图片裁剪旋转等
华为·harmonyos
SoraLuna4 小时前
「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现
开发语言·macos·ui·华为·harmonyos
Rossy Yan5 小时前
【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】
前端·typescript·harmonyos·arkts·web app·鸿蒙应用开发·合集
有颜有货6 小时前
华为的数字化转型框架和数字化转型成熟度评估方法
华为·数字化·数字化转型
轻口味17 小时前
【每日学点鸿蒙知识】RelativeContainer组件、List回弹、Flutter方法调用、Profiler工具等
flutter·list·harmonyos
HarmonyOS开发者18 小时前
《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发
华为·harmonyos
塞尔维亚大汉20 小时前
【OpenHarmony】 鸿蒙网络请求库之httpclient
网络协议·harmonyos
NanoNerd20 小时前
使用 4 种主要方法将数据从 HTC 传输到华为
华为·传输·步骤
我是全栈架构师1 天前
HarmonyOS Next ArkUI @State @Prop @Link @Provide @Consume笔记
harmonyos·arkts