HarmonyOS鸿蒙Next客户端中如何保持setInterval任务在后台不停止?

HarmonyOS鸿蒙Next客户端中如何保持setInterval任务在后台不停止? 如题。 使用了 backgroundTaskManager.requestSuspendDelay 申请短时任务,并没有作用。

代码如下:

let myReason = 'requestSuspendDelay';
try {
    let delayInfo = backgroundTaskManager.requestSuspendDelay(myReason, () => {
        Logger.info("Request suspension delay will time out.");
    })
    let id = delayInfo.requestId;
    let time = delayInfo.actualDelayTime;

    Logger.info(TAG, "The requestId is: " + id);
    Logger.info(TAG, "The actualDelayTime is: " + time);

    this.timerId = setInterval(() => {
        if (this.countDownSeconds == 0) {
            this.jumpToAppHomePage()
        } else {
            this.countDownSeconds--
        }
    }, AppConstants.SPLASH_INTERVAL_TIME);
} catch (error) {
    Logger.error(TAG, `requestSuspendDelay failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
}

更多关于HarmonyOS鸿蒙Next客户端中如何保持setInterval任务在后台不停止?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

应用退至后台后,在后台需要长时间运行用户可感知的任务,如录音、播放音乐等。为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。

请参考:链接

辛苦您提供下业务场景

或者您看短时任务可不可以满足您的需求:链接

您可以使用子线程worker,worker可以在后台线程中运行一个脚本操作耗时操作,参考文档:@ohos.worker (启动一个Worker)-ArkTS API-ArkTS(方舟编程语言)-应用框架 - 华为HarmonyOS开发者

或者上面所说的短时任务

// worker内部分代码示例

import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';

import { taskpool } from '@kit.ArkTS';

@Concurrent

async function testTaskPool(): Promise<number> {

  const res: number = await new Promise(resolve => {

    setTimeout(() => {

      // 假设是修改公共变量逻辑,一般需要是从别的文件导入的逻辑,@Concurrent使用详情查看https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-concurrent-0000001774120106

      resolve(666);

    }, 2000)

  })

  return res;

}

async function TaskPoolTest(): Promise<number> {

  try {

    let task: taskpool.Task = new taskpool.Task(testTaskPool);

    const result = await taskpool.execute(task) as number;

    return result;

  } catch (e) {

    console.error("taskpool execute error is: " + e);

    return 0;

  }

}

const workerPort: ThreadWorkerGlobalScope = worker.workerPort;

workerPort.onmessage = async (e: MessageEvents) => {

  // data:主线程发送的信息

  let data: string = e.data;

  console.log("worker.ets onmessage");

  // 如果需要taskpool阻塞住worker逻辑,就加上await

  //await TaskPoolTest();

  TaskPoolTest();

  // 假设这里有根据公共变量不同而不同操作的逻辑

  console.log("worker.ets after taskpool");

  // worker线程向主线程发送信息

  workerPort.postMessage("123")

}

更多关于HarmonyOS鸿蒙Next客户端中如何保持setInterval任务在后台不停止?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next客户端中,保持setInterval任务在后台不停止,可以通过使用BackgroundTaskManager来实现。BackgroundTaskManager是鸿蒙系统提供的后台任务管理机制,允许应用在后台执行长时间运行的任务。

首先,需要在应用的config.json文件中声明后台任务权限。在abilities节点下,添加backgroundModes字段,并设置为dataTransferlocation等类型,具体取决于任务的需求。

{
  "abilities": [
    {
      "name": ".MainAbility",
      "backgroundModes": ["dataTransfer"]
    }
  ]
}

接下来,在代码中使用BackgroundTaskManager注册后台任务。可以通过requestSuspendDelay方法来请求延迟挂起,确保任务在后台继续执行。

import backgroundTaskManager from '@ohos.backgroundTaskManager';

// 注册后台任务
let delayId = backgroundTaskManager.requestSuspendDelay("BackgroundTask", () => {
  // 任务被挂起时的处理
});

// 执行setInterval任务
let intervalId = setInterval(() => {
  // 任务逻辑
}, 1000);

// 取消后台任务
backgroundTaskManager.cancelSuspendDelay(delayId);

通过上述方法,可以确保setInterval任务在后台继续执行,而不会被系统挂起。需要注意的是,后台任务的执行时间仍然受到系统资源的限制,长时间运行的任务可能会导致应用被系统终止。

在HarmonyOS鸿蒙Next客户端中,默认情况下,setInterval任务在应用进入后台时会被暂停。为了保持任务在后台运行,可以使用Background Task Manager(后台任务管理器)来注册后台任务。具体步骤如下:

  1. 创建后台任务:实现一个继承自BackgroundTask的类,并在onStart方法中执行setInterval任务。
  2. 注册后台任务:在应用的config.json文件中配置后台任务,并设置合适的触发条件。
  3. 申请权限:确保应用已申请ohos.permission.KEEP_BACKGROUND_RUNNING权限,以便在后台持续运行。

通过这些步骤,setInterval任务可以在应用进入后台时继续执行。

回到顶部