【HarmonyOS】后台任务

目录

一、简介

功能介绍:

设备返回主界面、锁屏、应用切换等操作会使应用退至后台。应用退至后台后,如果继续在后台运行,可能会造成设备耗电快、用户界面卡断等现象。为了降低设备耗电速度等,系统会对退至后台的应用进行管控,包括进程挂起和进程终止。典型场景包括:应用退至后台一段时间应用进程会被挂起、资源不足时系统会终止部分应用进程(即回收进程的所有资源)。应用进程挂起后,无法使用软件资源(如公共事件、定时器等)和硬件资源(CPU、网络、GPS、蓝牙等)。

后台任务类型:

Background Tasks Kit提供了规范内受约束的后台任务,包括短时任务、长时任务、延迟任务、代理提醒。

  • 短时任务:适用于实时性要求高、耗时不长的任务,例如状态保存。
  • 长时任务:适用于长时间运行在后台、用户可感知的任务,例如后台播放音乐、导航、设备连接等,使用长时任务避免应用进程被挂起。
  • 延迟任务:对于实时性要求不高、可延迟执行的任务。系统提供了延迟任务,即满足条件的应用退至后台被放入执行队列,系统会根据内存、功耗等统一调度。
  • 代理提醒:代理提醒是指应用退后台或进程终止后,系统会代理应用做相应的提醒。适用于定时提醒类业务,当前支持的提醒类型包括倒计时、日历和闹钟三类。

后台任务类型选择

二、短时任务

概述

应用退至后台一小段时间后,应用进程会被挂起,无法执行对应的任务。如果应用需在被挂起前,执行一些耗时不长的任务,如状态保存、消息发送等,可以通过本文申请短时任务,扩展应用在后台的运行时间。

开发步骤

typescript 复制代码
//1.导入模块
import { backgroundTaskManager } from '@kit.BackgroundTasksKit'
import { BusinessError } from '@kit.BasicServicesKit'

//2.申请短时任务并实现回调。此处回调在短时任务即将结束时触发,与应用的业务功能不耦合,短时任务申请成功后,正常执行应用本身的任务
let id: number
let delayTime: number
function requestSuspendDelay() {
  let myReason = 'test requestSuspendDelay' //申请原因
  try {
    //回调函数。应用申请的短时任务即将超时,通过此回调应用,执行一些清理和标注工作,并取消短时任务
    let delayInfo = backgroundTaskManager.requestSuspendDelay(myReason, () => {
      console.info('suspend delay task will timeout');
      try {
        backgroundTaskManager.cancelSuspendDelay(id);
      } catch (err) {
        console.error(`Operation cancelSuspendDelay failed. code is ${(err as BusinessError).code} message is ${(err as BusinessError).message}`)
      }

    })
    id = delayInfo.requestId;
    delayTime = delayInfo.actualDelayTime
  } catch (err) {
    console.error(`Operation requestSuspendDelay failed. code is ${(err as BusinessError).code} message is ${(err as BusinessError).message}`);
  }
}

//3.获取短时任务剩余时间。查询本次短时任务的剩余时间,用以判断是否继续运行其他业务,例如应用有两个小任务,在执行完第一个小任务后,可以判断本次短时任务是否还有剩余时间来决定是否执行第二个小任务
async function getRemainingDelayTime() {
  backgroundTaskManager.getRemainingDelayTime(id).then((res: number) => {
    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}`)
  })
}
//4.取消短时任务
function cancelSuspendDelay() {
  try {
    backgroundTaskManager.cancelSuspendDelay(id);
  } catch (err) {
    console.error(`Operation cancelSuspendDelay failed. code is ${(err as BusinessError).code} message is ${(err as BusinessError).message}`);
  }
}

三、长时任务

概述

应用退至后台后,在后台需要长时间运行用户可感知的任务,如播放音乐、导航等。为了防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。在长时任务中,支持同时申请多种类型的任务,也可以对任务类型进行更新。应用退至后台执行业务时,系统会做一致性校验,确保应用在执行相应的长时任务。应用在申请长时任务成功后,通知栏会显示与长时任务相关联的消息,用户删除通知栏消息时,系统会自动停止长时任务。

约束与限制

申请限制 :Stage模型中,长时任务仅支持UIAbility申请;长时任务支持设备当前应用申请,也支持跨设备或跨应用申请,跨设备或跨应用仅对系统应用开放。
数量限制 :如果一个应用创建了多个UIAbility,一个UIAbility申请长时任务后,整个应用下的所有进程均不会被挂起。
运行限制

  • 申请长时任务后,应用未执行相应的业务,系统会对应用进行管控,即应用退至后台会被挂起。如系统检测到应用申请了AUDIO_PLAYBACK(音视频播放),但实际未播放音乐。
  • 申请长时任务后,应用执行的业务类型与申请的不一致,系统会对应用进行管控,即应用退至后台会被挂起。如系统检测到应用只申请了AUDIO_PLAYBACK(音视频播放),但实际上除了播放音乐(对应AUDIO_PLAYBACK类型),还在进行录制(对应AUDIO_RECORDING类型)。
  • 申请长时任务后,应用的业务已执行完,系统会对应用进行管控,即应用退至后台会被挂起。
  • 若运行长时任务的进程后台负载持续高于所申请类型的典型负载,系统会对应用进行管控,即应用退至后台会被挂起或终止。

开发步骤

以申请一个录制长时任务为例,实现以下功能:

  • 点击"申请长时任务"按钮,应用申请录制长时任务成功,通知栏显示"正在运行录制任务"通知
  • 点击"取消长时任务"按钮,取消长时任务,通知栏撤销相关通知。

1.需要申请ohos.permission.KEEP_BACKGROUND_RUNNING权限。

2.在module.json5中abilities下的backgroundModes字段里,为需要使用长时任务的UIAbility声明相应的长时任务类型,配置文件中填写长时任务类型的配置项。

typescript 复制代码
 "module": {
     "abilities": [
         {
             "backgroundModes": [
              // 长时任务类型的配置项
             "audioRecording",
             "bluetoothInteraction",
             "audioPlayback"
             ]
         }
     ],
     // ...
 }

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

typescript 复制代码
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { wantAgent, WantAgent } from '@kit.AbilityKit';
// 在元服务中,请删除WantAgent导入

function callback(info: backgroundTaskManager.ContinuousTaskCancelInfo) {
  // 长时任务id
  console.info('OnContinuousTaskCancel callback id ' + info.id);
  // 长时任务取消原因
  console.info('OnContinuousTaskCancel callback reason ' + info.reason);
}

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

  OnContinuousTaskCancel() {
    try {
      backgroundTaskManager.on("continuousTaskCancel", callback);
      console.info(`Succeeded in operationing OnContinuousTaskCancel.`);
    } catch (error) {
      console.error(`Operation OnContinuousTaskCancel failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
    }
  }

  OffContinuousTaskCancel() {
    try {
      // callback参数不传,则取消所有已注册的回调
      backgroundTaskManager.off("continuousTaskCancel", callback);
      console.info(`Succeeded in operationing OffContinuousTaskCancel.`);
    } catch (error) {
      console.error(`Operation OffContinuousTaskCancel failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
    }
  }

  // 申请长时任务.then()写法
  startContinuousTask() {
    let wantAgentInfo: wantAgent.WantAgentInfo = {
      // 点击通知后,将要执行的动作列表
      // 添加需要被拉起应用的bundleName和abilityName
      wants: [
        {
          bundleName: "com.example.myapplication",
          abilityName: "MainAbility"
        }
      ],
      // 指定点击通知栏消息后的动作是拉起ability
      actionType: wantAgent.OperationType.START_ABILITY,
      // 使用者自定义的一个私有值
      requestCode: 0,
      // 点击通知后,动作执行属性
      actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG],
      // 车钥匙长时任务子类型,从API version 16开始支持。只有申请bluetoothInteraction类型的长时任务,车钥匙子类型才能生效。
      // 确保extraInfo参数中的Key值为backgroundTaskManager.BackgroundModeType.SUB_MODE,否则子类型不生效。
      // extraInfo: { [backgroundTaskManager.BackgroundModeType.SUB_MODE] : backgroundTaskManager.BackgroundSubMode.CAR_KEY }
    };

    try {
      // 通过wantAgent模块下getWantAgent方法获取WantAgent对象
      // 在元服务中,使用wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: object) => {替换下面一行代码
      wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
        try {
          let list: Array<string> = ["audioRecording"];
          // let list: Array<string> = ["bluetoothInteraction"]; 长时任务类型包含bluetoothInteraction,CAR_KEY子类型合法
          // 在元服务中,let list: Array<string> = ["audioPlayback"];
          backgroundTaskManager.startBackgroundRunning(this.context, list, wantAgentObj).then((res: backgroundTaskManager.ContinuousTaskNotification) => {
            console.info("Operation startBackgroundRunning succeeded");
            // 此处执行具体的长时任务逻辑,如录音,录制等。
            // 系统会对业务场景的真实性进行检测,如果没有实际执行对应的业务,系统可能会取消对应的长时任务并挂起应用。
          }).catch((error: BusinessError) => {
            console.error(`Failed to Operation startBackgroundRunning. code is ${error.code} message is ${error.message}`);
          });
        } catch (error) {
          console.error(`Failed to Operation startBackgroundRunning. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
        }
      });
    } catch (error) {
      console.error(`Failed to Operation getWantAgent. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
    }
  }

  // 取消长时任务.then()写法
  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();
        })

        Button() {
          Text('注册长时任务取消回调').fontSize(25).fontWeight(FontWeight.Bold)
        }
        .type(ButtonType.Capsule)
        .margin({ top: 10 })
        .backgroundColor('#0D9FFB')
        .width(250)
        .height(40)
        .onClick(() => {
          // 通过按钮注册长时任务取消回调
          this.OnContinuousTaskCancel();
        })

        Button() {
          Text('取消注册长时任务取消回调').fontSize(25).fontWeight(FontWeight.Bold)
        }
        .type(ButtonType.Capsule)
        .margin({ top: 10 })
        .backgroundColor('#0D9FFB')
        .width(250)
        .height(40)
        .onClick(() => {
          // 通过按钮取消注册长时任务取消回调
          this.OffContinuousTaskCancel();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

4.申请和取消长时任务async/await写法

typescript 复制代码
 @Entry
 @Component
 struct Index {
   @State message: string = 'ContinuousTask';
  // 通过getUIContext().getHostContext()方法,来获取page所在的UIAbility上下文
   private context: Context | undefined = this.getUIContext().getHostContext();

   // 申请长时任务async/await写法
   async startContinuousTask() {
     let wantAgentInfo: wantAgent.WantAgentInfo = {
       // 点击通知后,将要执行的动作列表
       // 添加需要被拉起应用的bundleName和abilityName
       wants: [
         {
           bundleName: "com.example.myapplication",
           abilityName: "MainAbility"
         }
       ],
       // 指定点击通知栏消息后的动作是拉起ability
       actionType: wantAgent.OperationType.START_ABILITY,
       // 使用者自定义的一个私有值
       requestCode: 0,
       // 点击通知后,动作执行属性
       actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG],
       // 车钥匙长时任务子类型,从API version 16开始支持。只有申请bluetoothInteraction类型的长时任务,车钥匙子类型才能生效。
       // 确保extraInfo参数中的Key值为backgroundTaskManager.BackgroundModeType.SUB_MODE,否则子类型不生效。
       // extraInfo: { [backgroundTaskManager.BackgroundModeType.SUB_MODE] : backgroundTaskManager.BackgroundSubMode.CAR_KEY }
     };

     try {
       // 通过wantAgent模块下getWantAgent方法获取WantAgent对象
       // 在元服务中,使用const wantAgentObj: object = await wantAgent.getWantAgent(wantAgentInfo);替换下面一行代码
       const wantAgentObj: WantAgent = await wantAgent.getWantAgent(wantAgentInfo);
       try {
         let list: Array<string> = ["audioRecording"];
         // let list: Array<string> = ["bluetoothInteraction"]; 长时任务类型包含bluetoothInteraction,CAR_KEY子类型合法
         // 在元服务中,let list: Array<string> = ["audioPlayback"];
         const res: backgroundTaskManager.ContinuousTaskNotification = await backgroundTaskManager.startBackgroundRunning(this.context as Context, list, wantAgentObj);
         console.info(`Operation startBackgroundRunning succeeded, notificationId: ${res.notificationId}`);
         // 此处执行具体的长时任务逻辑,如录音,录制等。
       } catch (error) {
         console.error(`Failed to Operation startBackgroundRunning. Code is ${(error as BusinessError).code}, message is ${(error as BusinessError).message}`);
       }
     } catch (error) {
       console.error(`Failed to Operation getWantAgent. Code is ${(error as BusinessError).code}, message is ${(error as BusinessError).message}`);
     }
   }

   // 取消长时任务async/await写法
   async stopContinuousTask() {
     try {
       await backgroundTaskManager.stopBackgroundRunning(this.context);
       console.info(`Succeeded in operationing stopBackgroundRunning.`);
     } catch (error) {
       console.error(`Failed to operation stopBackgroundRunning. Code is ${(error as BusinessError).code}, message is ${(error as BusinessError).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%')
   }
 }

四、延迟任务

概述:

应用退至后台后,需要执行实时性要求不高的任务,例如有网络时不定期主动获取邮件等,可以使用延迟任务。当应用满足设定的触发条件(包括网络类型、充电雷西那个、存储状态、电池状态、定时状态等)时,将任务添加到执行队列,系统会根据内存、功耗、设备温度、用户使用习惯等统一调度拉起应用,执行相应的延迟任务。

运行原理

应用调用延迟任务接口添加、删除、查询延迟任务,延迟任务管理模块会根据任务设置的条件(通过WorkInfo参数设置,包括网络类型、充电类型、存储状态等)和系统状态(包括内存、功耗、设备温度、用户使用习惯等)统一决策调度时机。

当满足调度条件或调度结束时,系统会回调应用WorkSchedulerExtensionAbility中 onWorkStart() 或 onWorkStop() 的方法,同时会为应用单独创建一个Extension扩展进程用以承载WorkSchedulerExtensionAbility,并给WorkSchedulerExtensionAbility一定的活动周期,开发者可以在对应回调方法中实现自己的任务逻辑。

开发步骤

延迟任务调度开发步骤分为两步:实现延迟任务调度扩展能力、实现延迟任务调度
1.延迟任务调度扩展能力 :实现WorkShedulerExtensionAbility开始和结束的回调接口
2.延迟任务调度:调用延迟任务接口,实现延迟任务申请、取消等功能。

实现延迟任务回调扩展能力

1.新建工程目录。

在工程entry Module对应的ets目录(./entry/src/main/ets)下,新建目录及ArkTS文件,例如新建一个目录并命名为WorkSchedulerExtension。在WorkSchedulerExtension目录下,新建一个ArkTS文件并命名为WorkSchedulerExtension.ets,用以实现延迟任务回调接口。

2.导入模块。

typescript 复制代码
import { WorkSchedulerExtensionAbility, workScheduler } from '@kit.BackgroundTasksKit';

3.实现WorkSchedulerExtension生命周期接口。

typescript 复制代码
export default class MyWorkSchedulerExtensionAbility extends WorkSchedulerExtensionAbility {
  // 延迟任务开始回调
  onWorkStart(workInfo: workScheduler.WorkInfo) {
    console.info(`onWorkStart, workInfo = ${JSON.stringify(workInfo)}`);
    // 打印 parameters中的参数,如:参数key1
    // console.info(`work info parameters: ${JSON.parse(workInfo.parameters?.toString()).key1}`)
  }

  // 延迟任务结束回调。当延迟任务2分钟超时或应用调用stopWork接口取消任务时,触发该回调。
  onWorkStop(workInfo: workScheduler.WorkInfo) {
    console.info(`onWorkStop, workInfo is ${JSON.stringify(workInfo)}`);
  }
}

4.在module.json5配置文件中注册WorkSchedulerExtensionAbility,并设置如下标签:

  • type标签设置为"workScheduler"。
  • srcEntry标签设置为当前ExtensionAbility组件所对应的代码路径。
typescript 复制代码
{
  "module": {
      "extensionAbilities": [
        {
          "name": "MyWorkSchedulerExtensionAbility",
          "srcEntry": "./ets/WorkSchedulerExtension/WorkSchedulerExtension.ets",
          "type": "workScheduler"
        }
      ]
  }
}

实现延迟任务调度

1.导入模块。

typescript 复制代码
import { workScheduler } from '@kit.BackgroundTasksKit';
import { BusinessError } from '@kit.BasicServicesKit';

2.申请延迟任务。

typescript 复制代码
// 创建workinfo
const workInfo: workScheduler.WorkInfo = {
  workId: 1,
  networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
  bundleName: 'com.example.application',
  abilityName: 'MyWorkSchedulerExtensionAbility'
}

try {
  workScheduler.startWork(workInfo);
  console.info(`startWork success`);
} catch (error) {
  console.error(`startWork failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
}

3.取消延迟任务。

typescript 复制代码
// 创建workinfo
const workInfo: workScheduler.WorkInfo = {
  workId: 1,
  networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
  bundleName: 'com.example.application', 
  abilityName: 'MyWorkSchedulerExtensionAbility' 
}

try {
  workScheduler.stopWork(workInfo);
  console.info(`stopWork success`);
} catch (error) {
  console.error(`stopWork failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`);
}

延迟任务调度功能验证

确认延迟任务WorkSchedulerExtensionAbility回调方法onWorkStart、onWorkStop实现是否正确、是否可以成功回调

延迟任务申请成功之后,需要等到条件满足后才可以执行延迟任务回调,为了快速验证延迟任务回调功能是否正确,可以通过hidumper命令手动触发延迟任务执行回调。

五、代理提醒

功能介绍

应用退到后台或进程终止后,仍然有一些提醒用户的定时类通知,为满足此类功能场景,系统提供了代理提醒的能力。当应用退至后台或进程终止后,系统会代理应用做定时提醒。当前支持的提醒类型包括:倒计时、日历和闹钟。

接口说明

接口说明

以下是代理提醒的相关接口,下表均以Promise形式为例。

接口名 描述
publishReminder(reminderReq: ReminderRequest): Promise 发布后台代理提醒。
cancelReminder(reminderId: number): Promise 取消指定id的代理提醒。
getValidReminders(): Promise<Array> 获取当前应用设置的所有有效(未过期)的代理提醒。
cancelAllReminders(): Promise 取消当前应用设置的所有代理提醒。
addNotificationSlot(slot: NotificationSlot): Promise 添加通知渠道。
removeNotificationSlot(slotType: notification.SlotType): Promise 删除指定的通知渠道类型。

开发步骤

代理提醒开发能力申请

1.登录AppGallery Connect,选择"开发与服务"。

2.在项目列表中找到您的项目,在项目下的应用列表中选择需要申请代理提醒的应用。如果无对应应用,请先创建HarmonyOS应用。

3.进入"项目设置"->"开放能力管理"页面,点击"代理提醒"卡片对应的"申请"按钮。

4.在"新建业务申请"窗口填写申请原因,上传代理提醒功能场景截图和应用分类信息截图,然后点击"提交"。

5.返回"开放能力接入"页面,原"申请"按钮变为"申请中",8个工作日反馈申请结果。

6.申请审批通过后,互动中心会发送通知给您,同时"申请中"按钮会变为置灰显示的"申请"。

7.能力申请通过后,勾选代理提醒的能力开关,点击右上角"保存"。至此,您的应用已成功接入开放能力。此时,调试和发布应用必须使用手动签名。

申请权限

申请ohos.permission.PUBLISH_AGENT_REMINDER权限

请求通知授权

获取用户授权后,才能使用代理提醒功能

功能开发

1.导入模块

typescript 复制代码
import { reminderAgentManager } from '@kit.BackgroundTasksKit';
import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';

2.定义日期提醒代理。开发者根据实际需要,选择定义如下类型的提醒

  • 定义倒计时实例

    typescript 复制代码
    let targetReminderAgent: reminderAgentManager.ReminderRequestTimer = {
      reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_TIMER,   // 提醒类型为倒计时类型
      triggerTimeInSeconds: 10,
      actionButton: [ // 设置弹出的提醒通知信息上显示的按钮类型和标题
        {
          title: 'close',
          type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
        }
      ],
      wantAgent: {     // 点击提醒通知后跳转的目标UIAbility信息
        pkgName: 'com.example.myapplication',
        abilityName: 'EntryAbility'
      },
      title: 'this is title', // 指明提醒标题
      content: 'this is content', // 指明提醒内容
      expiredContent: 'this reminder has expired', // 指明提醒过期后需要显示的内容
      notificationId: 100, // 指明提醒使用的通知的ID号,相同ID号的提醒会覆盖
      slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION // 指明提醒的Slot类型
    }
  • 定义日历实例

    typescript 复制代码
    let targetReminderAgent: reminderAgentManager.ReminderRequestCalendar = {
      reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_CALENDAR, // 提醒类型为日历类型
      dateTime: {   // 指明提醒的目标时间
        year: 2023,
        month: 1,
        day: 1,
        hour: 11,
        minute: 14,
        second: 30
      },
      repeatMonths: [1], // 指明重复提醒的月份
      repeatDays: [1], // 指明重复提醒的日期
      actionButton: [ // 设置弹出的提醒通知信息上显示的按钮类型和标题
        {
          title: 'close',
          type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
        },
        {
          title: 'snooze',
          type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE
        },
      ],
      wantAgent: { // 点击提醒通知后跳转的目标UIAbility信息
        pkgName: 'com.example.myapplication',
        abilityName: 'EntryAbility'
      },
      ringDuration: 5, // 指明响铃时长(单位:秒)
      snoozeTimes: 2, // 指明延迟提醒次数
      timeInterval: 5*60, // 执行延迟提醒间隔(单位:秒)
      title: 'this is title', // 指明提醒标题
      content: 'this is content', // 指明提醒内容
      expiredContent: 'this reminder has expired', // 指明提醒过期后需要显示的内容
      snoozeContent: 'remind later', // 指明延迟提醒时需要显示的内容
      notificationId: 100, // 指明提醒使用的通知的ID号,相同ID号的提醒会覆盖
      slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION // 指明提醒的Slot类型
    }
  • 定义闹钟实例

    typescript 复制代码
    let targetReminderAgent: reminderAgentManager.ReminderRequestAlarm = {
      reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_ALARM, // 提醒类型为闹钟类型
      hour: 23, // 指明提醒的目标时刻
      minute: 9, // 指明提醒的目标分钟
      daysOfWeek: [2], // 指明每周哪几天需要重复提醒
      actionButton: [ // 设置弹出的提醒通知信息上显示的按钮类型和标题
        {
          title: 'close',
          type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
        },
        {
          title: 'snooze',
          type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE
        },
      ],
      wantAgent: { // 点击提醒通知后跳转的目标UIAbility信息
        pkgName: 'com.example.myapplication',
        abilityName: 'EntryAbility'
      },
      ringDuration: 5, // 指明响铃时长(单位:秒)
      snoozeTimes: 2, // 指明延迟提醒次数
      timeInterval: 5*60, // 执行延迟提醒间隔(单位:秒)
      title: 'this is title', // 指明提醒标题
      content: 'this is content', // 指明提醒内容
      expiredContent: 'this reminder has expired', // 指明提醒过期后需要显示的内容
      snoozeContent: 'remind later', // 指明延迟提醒时需要显示的内容
      notificationId: 99, // 指明提醒使用的通知的ID号,相同ID号的提醒会覆盖
      slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION // 指明提醒的Slot类型
    }

3.发布相应的提醒代理。代理发布后,应用即可使用后台代理提醒功能

typescript 复制代码
 reminderAgentManager.publishReminder(targetReminderAgent).then((res: number) => {
   console.info('Succeeded in publishing reminder. ');
   let reminderId: number = res; // 发布的提醒ID
 }).catch((err: BusinessError) => {
   console.error(`Failed to publish reminder. Code: ${err.code}, message: ${err.message}`);
 })

4.根据需要删除提醒任务

typescript 复制代码
 let reminderId: number = 1;
 // reminderId的值从发布提醒代理成功之后的回调中获得
 reminderAgentManager.cancelReminder(reminderId).then(() => {
   console.info('Succeeded in canceling reminder.');
 }).catch((err: BusinessError) => {
   console.error(`Failed to cancel reminder. Code: ${err.code}, message: ${err.message}`);
 });
相关推荐
lqj_本人1 小时前
鸿蒙Qt生命周期:后台被杀后的数据自救
qt·华为·harmonyos
G***66912 小时前
HarmonyOS在智能家居中的Huawei SmartHome
华为·智能家居·harmonyos
t***D2642 小时前
HarmonyOS分布式安全
安全·华为·harmonyos
9***P3342 小时前
HarmonyOS多语言支持
华为·harmonyos
2***57422 小时前
HarmonyOS在智能穿戴中的生物识别
华为·harmonyos
爱笑的眼睛113 小时前
深入理解HarmonyOS Ability生命周期管理:从基础到分布式场景实践
华为·harmonyos
x***B4113 小时前
HarmonyOS在智能家居中的Huawei
华为·智能家居·harmonyos
Q***f6353 小时前
HarmonyOS在智能家居中的设备联动
华为·智能家居·harmonyos
7***37453 小时前
HarmonyOS在智能家居中的Huawei HarmonyOS
华为·智能家居·harmonyos