HarmonyOS Next後臺任務開發入門:背景與基本任務型別

SameX發表於2024-10-27

本文旨在深入探討華為鴻蒙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 為我們開發者提供了豐富的後臺任務管理功能,幫助我們高效地管理和排程後臺任務,實現應用功能的持續執行。我們可以根據實際需求選擇合適的後臺任務型別,並結合具體的開發場景進行應用開發。

相關文章