網(wǎng)站視頻封面怎么做百度客服電話是多少
一、背景
主要梳理下鴻蒙系統(tǒng)開發(fā)中常用的生命周期
二、UIAbility組件?
UIAbility組件是一種包含UI界面的應(yīng)用組件,主要用于和用戶交互。
UIAbility組件是系統(tǒng)調(diào)度的基本單元,為應(yīng)用提供繪制界面的窗口;一個(gè)UIAbility組件中可以通過多個(gè)頁面來實(shí)現(xiàn)一個(gè)功能模塊。每一個(gè)UIAbility組件實(shí)例,都對(duì)應(yīng)于一個(gè)最近任務(wù)列表中的任務(wù)。
2.1、UIAbility組件生命周期
當(dāng)用戶打開、切換和返回到對(duì)應(yīng)應(yīng)用時(shí),應(yīng)用中的UIAbility實(shí)例會(huì)在其生命周期的不同狀態(tài)之間轉(zhuǎn)換。
UIAbility的生命周期包括Create、Foreground、Background、Destroy四個(gè)狀態(tài),如下圖所示。
2.2、生命周期狀態(tài)說明
2.2.1、Create狀態(tài)
在應(yīng)用加載過程中,UIAbility實(shí)例創(chuàng)建完成時(shí)觸發(fā),系統(tǒng)會(huì)調(diào)用onCreate()回調(diào)??梢栽谠摶卣{(diào)中進(jìn)行頁面初始化操作,例如變量定義資源加載等,用于后續(xù)的UI界面展示。
2.2.2、WindowStageCreate和WindowStageDestroy狀態(tài)
UIAbility實(shí)例創(chuàng)建完成之后,在進(jìn)入Foreground之前,系統(tǒng)會(huì)創(chuàng)建一個(gè)WindowStage。WindowStage創(chuàng)建完成后會(huì)進(jìn)入onWindowStageCreate()回調(diào),可以在該回調(diào)中設(shè)置UI界面加載、設(shè)置WindowStage的事件訂閱。
2.2.3、Foreground和Background狀態(tài)?
Foreground和Background狀態(tài)分別在UIAbility實(shí)例切換至前臺(tái)和切換至后臺(tái)時(shí)觸發(fā),對(duì)應(yīng)于onForeground()回調(diào)和onBackground()回調(diào)。
onForeground()回調(diào),在UIAbility的UI界面可見之前,如UIAbility切換至前臺(tái)時(shí)觸發(fā)??梢栽趏nForeground()回調(diào)中申請系統(tǒng)需要的資源,或者重新申請?jiān)趏nBackground()中釋放的資源。
onBackground()回調(diào),在UIAbility的UI界面完全不可見之后,如UIAbility切換至后臺(tái)時(shí)候觸發(fā)??梢栽趏nBackground()回調(diào)中釋放UI界面不可見時(shí)無用的資源,或者在此回調(diào)中執(zhí)行較為耗時(shí)的操作,例如狀態(tài)保存等。
2.2.4、Destroy狀態(tài)
Destroy狀態(tài)在UIAbility實(shí)例銷毀時(shí)觸發(fā)。可以在onDestroy()回調(diào)中進(jìn)行系統(tǒng)資源的釋放、數(shù)據(jù)的保存等操作。
三、頁面和自定義組件生命周期
3.1、先明確自定義組件和頁面的關(guān)系:
①自定義組件:@Component裝飾的UI單元,可以組合多個(gè)系統(tǒng)組件實(shí)現(xiàn)UI的復(fù)用,可以調(diào)用組件的生命周期。
②頁面:即應(yīng)用的UI頁面??梢杂梢粋€(gè)或者多個(gè)自定義組件組成,@Entry裝飾的自定義組件為頁面的入口組件,即頁面的根節(jié)點(diǎn),一個(gè)頁面有且僅能有一個(gè)@Entry。只有被@Entry裝飾的組件才可以調(diào)用頁面的生命周期。
3.2、頁面生命周期:
onPageShow:頁面每次顯示時(shí)觸發(fā)一次,包括路由過程、應(yīng)用進(jìn)入前臺(tái)等場景。
onPageHide:頁面每次隱藏時(shí)觸發(fā)一次,包括路由過程、應(yīng)用進(jìn)入后臺(tái)等場景。 onBackPress:當(dāng)用戶點(diǎn)擊返回按鈕時(shí)觸發(fā)。
3.3、組件生命周期:
①aboutToAppear:組件即將出現(xiàn)時(shí)回調(diào)該接口,具體時(shí)機(jī)為在創(chuàng)建自定義組件的新實(shí)例后,在執(zhí)行其build()函數(shù)之前執(zhí)行。
②aboutToDisappear:在自定義組件析構(gòu)銷毀之前執(zhí)行。不允許在aboutToDisappear函數(shù)中改變狀態(tài)變量,特別是@Link變量的修改可能會(huì)導(dǎo)致應(yīng)用程序行為不穩(wěn)定。
以下示例展示了生命周期的調(diào)用時(shí)機(jī):示例來自于官網(wǎng)文檔中心
// Index.ets
import router from '@ohos.router';@Entry
@Component
struct MyComponent {@State showChild: boolean = true;// 只有被@Entry裝飾的組件才可以調(diào)用頁面的生命周期onPageShow() {console.info('Index onPageShow');}// 只有被@Entry裝飾的組件才可以調(diào)用頁面的生命周期onPageHide() {console.info('Index onPageHide');}// 只有被@Entry裝飾的組件才可以調(diào)用頁面的生命周期onBackPress() {console.info('Index onBackPress');}// 組件生命周期aboutToAppear() {console.info('MyComponent aboutToAppear');}// 組件生命周期aboutToDisappear() {console.info('MyComponent aboutToDisappear');}build() {Column() {// this.showChild為true,創(chuàng)建Child子組件,執(zhí)行Child aboutToAppearif (this.showChild) {Child()}// this.showChild為false,刪除Child子組件,執(zhí)行Child aboutToDisappearButton('delete Child').onClick(() => {this.showChild = false;})// push到Page2頁面,執(zhí)行onPageHideButton('push to next page').onClick(() => {router.pushUrl({ url: 'pages/Page2' });})}}
}@Component
struct Child {@State title: string = 'Hello World';// 組件生命周期aboutToDisappear() {console.info('[lifeCycle] Child aboutToDisappear')}// 組件生命周期aboutToAppear() {console.info('[lifeCycle] Child aboutToAppear')}build() {Text(this.title).fontSize(50).onClick(() => {this.title = 'Hello ArkUI';})}
}
以上示例中,Index頁面包含兩個(gè)自定義組件,一個(gè)是被@Entry裝飾的MyComponent,也是頁面的入口組件,即頁面的根節(jié)點(diǎn);一個(gè)是Child,是MyComponent的子組件。只有@Entry裝飾的節(jié)點(diǎn)才可以使頁面級(jí)別的生命周期方法生效,所以MyComponent中聲明了當(dāng)前Index頁面的頁面生命周期函數(shù)。MyComponent和其子組件Child也同時(shí)也聲明了組件的生命周期函數(shù)。
- 應(yīng)用冷啟動(dòng)的初始化流程為:MyComponent aboutToAppear --> MyComponent build --> Child aboutToAppear --> Child build --> Child build執(zhí)行完畢 --> MyComponent build執(zhí)行完畢 --> Index onPageShow。
- 點(diǎn)擊“delete Child”,if綁定的this.showChild變成false,刪除Child組件,會(huì)執(zhí)行Child aboutToDisappear方法。
- 點(diǎn)擊“push to next page”,調(diào)用router.pushUrl接口,跳轉(zhuǎn)到另外一個(gè)頁面,當(dāng)前Index頁面隱藏,執(zhí)行頁面生命周期Index onPageHide。此處調(diào)用的是router.pushUrl接口,Index頁面被隱藏,并沒有銷毀,所以只調(diào)用onPageHide。跳轉(zhuǎn)到新頁面后,執(zhí)行初始化新頁面的生命周期的流程。
- 如果調(diào)用的是router.replaceUrl,則當(dāng)前Index頁面被銷毀,執(zhí)行的生命周期流程將變?yōu)?#xff1a;Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。上文已經(jīng)提到,組件的銷毀是從組件樹上直接摘下子樹,所以先調(diào)用父組件的aboutToDisappear,再調(diào)用子組件的aboutToDisappear,然后執(zhí)行初始化新頁面的生命周期流程。
- 點(diǎn)擊返回按鈕,觸發(fā)頁面生命周期Index onBackPress,且觸發(fā)返回一個(gè)頁面后會(huì)導(dǎo)致當(dāng)前Index頁面被銷毀。
- 最小化應(yīng)用或者應(yīng)用進(jìn)入后臺(tái),觸發(fā)Index onPageHide。當(dāng)前Index頁面沒有被銷毀,所以并不會(huì)執(zhí)行組件的aboutToDisappear。應(yīng)用回到前臺(tái),執(zhí)行Index onPageShow。
- 退出應(yīng)用,執(zhí)行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。