本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

随着移动互联网的快速发展,用户对应用的功能需求日益丰富,应用在后台运行的需求也越来越常见。然而,后台任务的管理却面临着诸多挑战,例如设备能耗、用户体验等。HarmonyOS Next 作为华为自主研发的分布式操作系统,提供了完善的 Background Tasks Kit 后台任务开发框架,帮助我们开发者高效地管理和调度后台任务,实现应用功能的持续运行。

Background Tasks Kit 的作用与应用场景

Background Tasks Kit 是 HarmonyOS Next 提供的后台任务开发框架,其主要作用如下:

  • 降低设备能耗:通过规范后台任务的使用,避免应用在后台过度消耗设备资源,延长设备续航时间。
  • 优化用户体验:确保后台任务的正常运行,避免应用在后台被系统杀掉,保证用户体验的连贯性。
  • 提供多种后台任务类型:支持短时任务、长时任务、延迟任务、代理提醒等多种后台任务类型,满足不同场景的开发需求。

    后台任务的种类和特点

    Background Tasks Kit 提供了四种后台任务类型,每种类型都有其独特的特点和适用场景:

    任务类型特点适用场景
    短时任务(Transient Task)实时性要求高,耗时不长保存状态、发送消息、网络请求等
    长时任务(Continuous Task)长时间后台运行音乐播放、导航、设备连接、位置跟踪等
    延迟任务(Deferred Task)允许条件触发有网络时不定期主动获取邮件、定期同步数据等
    代理提醒(Agent-powered Reminder)系统在后台代理应用执行的提醒任务倒计时、闹钟、日历、会议提醒等

    短时任务

    短时任务适用于后台实时性要求较高且耗时较短的任务,例如保存状态、发送消息、网络请求等。开发者可以通过 requestSuspendDelay 接口申请短时任务,并设置回调函数处理任务超时的情况。
    代码示例

    import { backgroundTaskManager } from '@kit.BackgroundTasksKit';
    function requestSuspendDelay() {
    let myReason = 'test requestSuspendDelay'; // 申请原因
    let delayInfo = backgroundTaskManager.requestSuspendDelay(myReason, () => {
      // 回调函数。应用申请的短时任务即将超时,通过此函数回调应用,执行一些清理和标注工作,并取消短时任务
      console.info('suspend delay task will timeout');
      backgroundTaskManager.cancelSuspendDelay(delayInfo.requestId);
    });
    }

    长时任务

    长时任务适用于长时间后台运行的任务,例如音乐播放、导航、设备连接、位置跟踪等。开发者需要创建一个 ContinuousTaskExtensionAbility 来承载长时任务,并实现 onContinuousTaskStartonContinuousTaskStop 回调函数,分别处理任务开始和结束的逻辑。
    代码示例

    import { ContinuousTaskExtensionAbility, backgroundTaskManager } from '@kit.BackgroundTasksKit';
    export default class MyContinuousTaskExtensionAbility extends ContinuousTaskExtensionAbility {
    onContinuousTaskStart(workInfo: backgroundTaskManager.WorkInfo) {
      console.info(`onContinuousTaskStart, workInfo = ${JSON.stringify(workInfo)}`);
      // 开始执行长时任务逻辑
    }
    onContinuousTaskStop(workInfo: backgroundTaskManager.WorkInfo) {
      console.info(`onContinuousTaskStop, workInfo is ${JSON.stringify(workInfo)}`);
      // 停止执行长时任务逻辑
    }
    }

    延迟任务

    延迟任务允许条件触发(如网络或充电条件)的任务,例如有网络时不定期主动获取邮件、定期同步数据等。开发者可以通过 startWork 接口申请延迟任务,并设置触发条件、循环间隔、循环次数等信息。
    代码示例

    import { workScheduler } from '@kit.BackgroundTasksKit';
    const workInfo: workScheduler.WorkInfo = {
    workId: 1,
    networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI,
    bundleName: 'com.example.application',
    abilityName: 'MyWorkSchedulerExtensionAbility',
    repeatCycleTime: 2 * 60 * 60 * 1000, // 每2小时执行一次
    repeatCount: 10 // 重复执行10次
    };
    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}`);
    }

    代理提醒

    代理提醒是系统在后台代理应用执行的提醒任务,例如倒计时、闹钟、日历、会议提醒等。开发者可以通过 publishReminder 接口发布提醒任务,并设置提醒类型、触发时间、提醒内容、通知渠道等信息。
    代码示例

    import { reminderAgentManager } from '@kit.BackgroundTasksKit';
    import { notificationManager } from '@kit.NotificationKit';
    let targetReminderAgent: reminderAgentManager.ReminderRequestTimer = {
    reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_TIMER, // 提醒类型为倒计时类型
    triggerTimeInSeconds: 10,
    actionButton: [{ title: 'close', type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE }],
    wantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
    maxScreenWantAgent: { pkgName: 'com.example.myapplication', abilityName: 'EntryAbility' },
    title: 'this is title',
    content: 'this is content',
    expiredContent: 'this reminder has expired',
    notificationId: 100,
    slotType: notificationManager.SlotType.SOCIAL_COMMUNICATION
    };
    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}`);
    });

    结语

    HarmonyOS Next 的 Background Tasks Kit 为我们开发者提供了丰富的后台任务管理功能,帮助我们高效地管理和调度后台任务,实现应用功能的持续运行。我们可以根据实际需求选择合适的后台任务类型,并结合具体的开发场景进行应用开发。


SameX
1 声望2 粉丝