本文旨在深入探討華為鴻蒙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
來承載長時任務,並實現 onContinuousTaskStart
和 onContinuousTaskStop
回撥函式,分別處理任務開始和結束的邏輯。
程式碼示例:
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 為我們開發者提供了豐富的後臺任務管理功能,幫助我們高效地管理和排程後臺任務,實現應用功能的持續執行。我們可以根據實際需求選擇合適的後臺任務型別,並結合具體的開發場景進行應用開發。