【HarmonyOS 5】鴻蒙中的UIAbility詳解(三)
##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)#
一、前言
本文是鴻蒙中的UIAbility詳解系列的最終章。主要針對(duì)UIAbility的冷啟動(dòng)和熱啟動(dòng),對(duì)于want數(shù)據(jù)的處理。UIAbility的備份恢復(fù),UIAbility的接續(xù)等高級(jí)功能的概念和使用講解。
二、UIAbility啟動(dòng)模式:冷啟動(dòng)與熱啟動(dòng)的Want數(shù)據(jù)處理
1. 冷啟動(dòng)(Cold Start)
應(yīng)用首次啟動(dòng)或被系統(tǒng)完全終止后重新創(chuàng)建。
冷啟動(dòng),應(yīng)用會(huì)從onCreate函數(shù)中進(jìn)入,通過want參數(shù),我們可以處理其中攜帶的信息。像applink就是uri,deeplink就是parameters?.deepLink,還有推送等。
核心邏輯很簡單,根據(jù)want中對(duì)應(yīng)需要處理的字段信息,進(jìn)行邏輯處理(跳轉(zhuǎn)目標(biāo)頁面,數(shù)據(jù)和業(yè)務(wù)處理等)。
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
const deepLinkData = want.parameters?.deepLink; // 解析深層鏈接參數(shù)
this.initData(deepLinkData);
}
2. 熱啟動(dòng)(Warm Start)
應(yīng)用在后臺(tái)運(yùn)行時(shí)被重新激活(如切換任務(wù)或接收新事件)。
一般和冷啟動(dòng)處理是一對(duì)兒,處理邏輯也和冷啟動(dòng)一致。只不過此時(shí)應(yīng)用從onNewWant函數(shù)跳進(jìn)來。時(shí)機(jī)也是App已經(jīng)創(chuàng)建了,此時(shí)又被激活。
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
if (launchParam.launchReason === AbilityConstant.LaunchReason.NEW_WANT) {
const updateData = want.parameters?.updateData; // 解析熱啟動(dòng)參數(shù)
this.refreshUI(updateData);
}
}
總結(jié):冷熱啟動(dòng)區(qū)別對(duì)比
特性 | 冷啟動(dòng) | 熱啟動(dòng) |
---|---|---|
觸發(fā)條件 | 首次啟動(dòng)/進(jìn)程終止后重啟 | 從后臺(tái)喚醒/接收新Want |
生命周期入口 | onCreate | onNewWant (單實(shí)例) |
頁面棧處理 | 重建頁面棧 | 恢復(fù)現(xiàn)有頁面棧 |
Want參數(shù)來源 | 啟動(dòng)時(shí)指定(如圖標(biāo)點(diǎn)擊、鏈接) | 運(yùn)行中動(dòng)態(tài)傳入(如跨Ability調(diào)用) |
3. 源碼示例
// EntryAbility.ets
export default class EntryAbility extends UIAbility {
private selectPage: string = '';
// 冷啟動(dòng)時(shí)觸發(fā)
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
this.parseParams(want); // 解析參數(shù)
}
// 熱啟動(dòng)時(shí)觸發(fā)
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
this.parseParams(want); // 解析參數(shù)
if (this.currentWindowStage) {
this.onWindowStageCreate(this.currentWindowStage); // 重新加載頁面
}
}
// 解析參數(shù)邏輯
private parseParams(want: Want) {
if (want.parameters?.params) {
const params = JSON.parse(want.parameters.params as string);
this.selectPage = params.targetPage; // 獲取目標(biāo)頁面標(biāo)識(shí)(funA/funB)
}
}
// 加載頁面
onWindowStageCreate(windowStage: window.WindowStage) {
let targetPage = 'pages/Index'; // 默認(rèn)頁面
switch (this.selectPage) {
case 'funA': targetPage = 'pages/FunA'; break;
case 'funB': targetPage = 'pages/FunB'; break;
}
windowStage.loadContent(targetPage); // 加載對(duì)應(yīng)頁面
}
}
二、UIAbility備份恢復(fù):保障異常終止后的狀態(tài)延續(xù)
應(yīng)用因系統(tǒng)資源不足被后臺(tái)終止時(shí),自動(dòng)保存狀態(tài)。
下次啟動(dòng)時(shí)還原數(shù)據(jù)(如編輯中的內(nèi)容、頁面位置)。
1. 啟用備份功能
在onCreate
中調(diào)用setRestoreEnabled(true)
:
export default class EntryAbility extends UIAbility {
onCreate() {
this.context.setRestoreEnabled(true); // 初始化時(shí)啟用備份
}
}
2. 保存自定義數(shù)據(jù)
重寫onSaveState
方法,通過WantParams
存儲(chǔ)數(shù)據(jù):
onSaveState(state: AbilityConstant.StateType, wantParams: Record< string, Object >) {
wantParams["editorContent"] = this.editor.getText(); // 保存編輯內(nèi)容
wantParams["currentPage"] = this.router.getCurrentPage(); // 保存頁面路由
return AbilityConstant.OnSaveResult.ALL_AGREE;
}
3. 恢復(fù)數(shù)據(jù)
在onCreate
或onNewWant
中解析參數(shù):
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
if (want.parameters?.editorContent) {
this.editor.setText(want.parameters.editorContent as string); // 恢復(fù)文本
this.router.navigateTo(want.parameters.currentPage as string); // 恢復(fù)頁面路由
}
}
注意
1. 數(shù)據(jù)限制 :單次備份最大200KB,存儲(chǔ)時(shí)效7天,重啟設(shè)備不保留。
2. 適用場景 :臨時(shí)數(shù)據(jù)(如未保存的表單)、頁面狀態(tài)(如滾動(dòng)位置), 不建議存儲(chǔ)敏感數(shù)據(jù) 。
3. 性能優(yōu)化 :避免在onSaveState
中執(zhí)行耗時(shí)操作,優(yōu)先存儲(chǔ)關(guān)鍵狀態(tài)。
三、應(yīng)用接續(xù)(Continuation):跨設(shè)備任務(wù)無縫遷移
將當(dāng)前頁面狀態(tài)、路由信息遷移至另一設(shè)備(如手機(jī)→平板)。
支持按場景開啟/關(guān)閉遷移(如僅在編輯頁允許遷移)。
小數(shù)據(jù)通過wantParam
傳輸(≤100KB),大數(shù)據(jù)使用分布式數(shù)據(jù)對(duì)象(DDO)。
1. 配置可遷移能力
在module.json5
中設(shè)置continuable: true
:
{
"abilities": [
{
"name": "EditorAbility",
"continuable": true // 啟用跨設(shè)備遷移
}
]
}
2. 源端(發(fā)起遷移設(shè)備)實(shí)現(xiàn)
onContinue
回調(diào):保存數(shù)據(jù)、校驗(yàn)兼容性、決定是否遷移。
onContinue(wantParam: Record< string, Object >): OnContinueResult {
// 校驗(yàn)?zāi)繕?biāo)設(shè)備版本
if (wantParam.version < MIN_SUPPORT_VERSION) return MISMATCH;
// 保存編輯內(nèi)容
wantParam["editorData"] = this.editor.getData();
// 動(dòng)態(tài)控制遷移狀態(tài)(如僅在編輯頁允許遷移)
if (this.currentPage !== 'EditorPage') return REJECT;
return AGREE;
}
4. 目標(biāo)端(接收設(shè)備)恢復(fù)
冷啟動(dòng)時(shí)通過onCreate
恢復(fù),熱啟動(dòng)時(shí)通過onNewWant
恢復(fù):
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
if (launchParam.launchReason === CONTINUATION) {
const editorData = want.parameters?.editorData;
this.editor.setData(editorData); // 恢復(fù)數(shù)據(jù)
this.context.restoreWindowStage(); // 自動(dòng)恢復(fù)頁面棧
}
}
注意
1. 針對(duì)動(dòng)態(tài)開關(guān)遷移 :通過setMissionContinueState
控制(如在非編輯頁禁用):
// 在非編輯頁關(guān)閉遷移
this.context.setMissionContinueState(AbilityConstant.ContinueState.INACTIVE);
2. 針對(duì)自定義頁面棧 :關(guān)閉自動(dòng)恢復(fù),手動(dòng)指定目標(biāo)頁面:
onContinue(wantParam) {
wantParam[wantConstant.Params.SUPPORT_CONTINUE_PAGE_STACK_KEY] = false; // 禁用自動(dòng)恢復(fù)
wantParam["targetPage"] = "SummaryPage"; // 自定義目標(biāo)頁面
}
3. 針對(duì)大數(shù)據(jù)遷移 :使用分布式數(shù)據(jù)對(duì)象(DDO)同步文件或大文本:
// 源端創(chuàng)建DDO并保存
const ddo = distributedDataObject.create(this.context, largeData);
wantParam["ddoSessionId"] = ddo.genSessionId(); // 傳遞會(huì)話ID至目標(biāo)端
審核編輯 黃宇
-
鴻蒙
+關(guān)注
關(guān)注
60文章
2613瀏覽量
44003 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2121瀏覽量
32874
發(fā)布評(píng)論請(qǐng)先 登錄
深入理解HarmonyOS UIAbility:生命周期、WindowStage與啟動(dòng)模式探析

HarmonyOS開發(fā)案例:【UIAbility內(nèi)和UIAbility間頁面的跳轉(zhuǎn)】

鴻蒙開發(fā)-應(yīng)用程序框架UIAbility的使用
【HarmonyOS 5】VisionKit人臉活體檢測詳解

HarmonyOS 5 makeObserved接口詳解
【HarmonyOS 5】鴻蒙應(yīng)用隱私保護(hù)詳解
【HarmonyOS 5】金融應(yīng)用開發(fā)鴻蒙組件實(shí)踐

【HarmonyOS 5】桌面快捷方式功能實(shí)現(xiàn)詳解

【 HarmonyOS 5 入門系列 】鴻蒙HarmonyOS示例項(xiàng)目講解

評(píng)論