HarmonyOS 鸿蒙Next 如何使用 getRemainingDelayTime 接口来获取剩余的短时任务时间 并根据剩余时间决定是否继续执行任务

发布于 1周前 作者 songsunli 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何使用 getRemainingDelayTime 接口来获取剩余的短时任务时间 并根据剩余时间决定是否继续执行任务

cke_163.png如何使用 getRemainingDelayTime 接口来获取剩余的短时任务时间,并根据剩余时间决定是否继续执行任务?#HarmonyOS最强问答官#


更多关于HarmonyOS 鸿蒙Next 如何使用 getRemainingDelayTime 接口来获取剩余的短时任务时间 并根据剩余时间决定是否继续执行任务的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

可以参考demo:

index页面:

import { ApplicationStateChangeCallback, common } from '@kit.AbilityKit';
import SuspendTaskUtils from '../utils/SuspendTaskUtils';
import { SuspendTaskInfo } from '../viewmodel/SuspendTaskInfo';
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
  [@State](/user/State) message: string = '短时任务测试页面';
  private context = getContext(this) as common.UIAbilityContext;
  private messageCount: number = 0;
  aboutToAppear(): void {
    this.subscribeStateChange();
    // 启动一个定时器,每隔2s发送一条消息--模拟应用后台任务
    setInterval(() => {
      this.messageCount ++;
      console.info(`already sent ${this.messageCount} messages`);
    },2000);
  }
  /**
   * 应用前后台状态监听
   */
  subscribeStateChange(): void {
    // 1.获取ApplicationContext
    let applicationContext = this.context.getApplicationContext();
    let suspendTaskInfo: SuspendTaskInfo ;
    // 2.通过applicationContext订阅变量变化
    let appStateChangeCallBack: ApplicationStateChangeCallback = {
      onApplicationForeground() {
        console.info('app is on Foreground');
      },
      onApplicationBackground() {
        console.info('app is on Background');
        //应用由前台转为后台时,申请短时任务
        suspendTaskInfo = SuspendTaskUtils.requestSuspendDelay('test suspendtask');
        console.info(`background suspend task id:${suspendTaskInfo.id}, delayTime:${suspendTaskInfo.delayTime}`)
      }
    }
    applicationContext.on('applicationStateChange', appStateChangeCallBack);
  }
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
          .margin({
            bottom: 10
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

SuspendTaskUtils页面:

import { backgroundTaskManager } from '@kit.BackgroundTasksKit';
import { SuspendTaskInfo } from '../viewmodel/SuspendTaskInfo';
import { BusinessError } from '@kit.BasicServicesKit';
 class SuspendTaskUtils {
  /**
   * 申请短时任务,返回任务ID和任务剩余时间
   * [@param](/user/param) reason  申请原因
   */
  requestSuspendDelay(reason: string): SuspendTaskInfo {
    let id: number; // 申请短时任务ID
    let delayTime: number; // 本次申请短时任务的剩余时间
    let delayInfo = backgroundTaskManager.requestSuspendDelay(reason, () => {
      // 回调函数。应用申请的短时任务即将超时,通过此函数回调应用,执行一些清理和标注工作,并取消短时任务
      console.info('suspend delay task will timeout');
      backgroundTaskManager.cancelSuspendDelay(id);
    })
    id = delayInfo.requestId;
    delayTime = delayInfo.actualDelayTime;
    let taskInfo = {
      id: id,
      delayTime: delayTime
    } as SuspendTaskInfo;
    return taskInfo;
  }
  /**
   * 获取指定短时任务的剩余时间
   * [@param](/user/param) id  待查询的短时任务ID
   */
  async getRemainingDelayTime(id: number): Promise<number> {
    let delayTime: number = -1;
    backgroundTaskManager.getRemainingDelayTime(id).then((res: number) => {
      delayTime = res;
      console.info('Succeeded in getting remaining delay time.');
    }).catch((err: BusinessError) => {
      console.error(`Failed to get remaining delay time. Code: ${err.code}, message: ${err.message}`);
    })
    return delayTime;
  }
  /**
   * 取消短时任务
   * [@param](/user/param) id 待取消的短时任务ID
   */
   cancelSuspendDelay(id: number) {
    backgroundTaskManager.cancelSuspendDelay(id);
  }
}
let suspendTaskUtils = new SuspendTaskUtils();
export default suspendTaskUtils as SuspendTaskUtils;

SuspendTaskInfo:

export interface SuspendTaskInfo {
  id: number ; // 短时任务ID
  delayTime: number; // 本次申请短时任务的剩余时间
}

更多关于HarmonyOS 鸿蒙Next 如何使用 getRemainingDelayTime 接口来获取剩余的短时任务时间 并根据剩余时间决定是否继续执行任务的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,getRemainingDelayTime接口用于获取已调度短时任务(Short-duration Task)的剩余延迟时间。以下是该接口的使用步骤及如何根据剩余时间决定是否继续执行任务:

  1. 获取任务句柄:首先,你需要有一个已调度的短时任务句柄。这个句柄通常在任务调度时返回。

  2. 调用getRemainingDelayTime:使用任务句柄调用getRemainingDelayTime接口,该接口会返回一个表示剩余延迟时间的值(单位通常为毫秒)。

  3. 判断剩余时间:检查返回的剩余时间值。如果剩余时间大于0,表示任务还未到执行时间,你可以根据业务逻辑决定是否继续等待或执行其他操作;如果剩余时间小于或等于0,表示任务已到达或已过执行时间,此时可以决定是否立即执行任务或进行其他处理。

示例代码(伪代码):

// 假设taskHandle是已调度的短时任务句柄
int64_t remainingTime = GetRemainingDelayTime(taskHandle);
if (remainingTime > 0) {
    // 剩余时间大于0,根据业务逻辑决定是否继续等待
} else {
    // 剩余时间小于等于0,决定是否立即执行任务
    ExecuteTask();
}

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部