鴻蒙應(yīng)用開(kāi)發(fā) 應(yīng)用程序入口 UIAbility使用_第1頁(yè)
鴻蒙應(yīng)用開(kāi)發(fā) 應(yīng)用程序入口 UIAbility使用_第2頁(yè)
鴻蒙應(yīng)用開(kāi)發(fā) 應(yīng)用程序入口 UIAbility使用_第3頁(yè)
鴻蒙應(yīng)用開(kāi)發(fā) 應(yīng)用程序入口 UIAbility使用_第4頁(yè)
鴻蒙應(yīng)用開(kāi)發(fā) 應(yīng)用程序入口 UIAbility使用_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

鴻蒙應(yīng)用開(kāi)發(fā)應(yīng)用程序入口UIAbility使用UIAbility概述UIAbility是一種包含用戶界面的應(yīng)用組件,主要用于和用戶進(jìn)行交互。UIAbility也是系統(tǒng)調(diào)度的單元,為應(yīng)用提供窗口在其中繪制界面。每一個(gè)UIAbility實(shí)例,都對(duì)應(yīng)于一個(gè)最近任務(wù)列表中的任務(wù)。一個(gè)應(yīng)用可以有一個(gè)UIAbility,也可以有多個(gè)UIAbility,如下圖所示。例如瀏覽器應(yīng)用可以通過(guò)一個(gè)UIAbility結(jié)合多頁(yè)面的形式讓用戶進(jìn)行的搜索和瀏覽內(nèi)容;而聊天應(yīng)用增加一個(gè)“外賣(mài)功能”的場(chǎng)景,則可以將聊天應(yīng)用中“外賣(mài)功能”的內(nèi)容獨(dú)立為一個(gè)UIAbility,當(dāng)用戶打開(kāi)聊天應(yīng)用的“外賣(mài)功能”,查看外賣(mài)訂單詳情,此時(shí)有新的聊天消息,即可以通過(guò)最近任務(wù)列表切換回到聊天窗口繼續(xù)進(jìn)行聊天對(duì)話。一個(gè)UIAbility可以對(duì)應(yīng)于多個(gè)頁(yè)面,建議將一個(gè)獨(dú)立的功能模塊放到一個(gè)UIAbility中,以多頁(yè)面的形式呈現(xiàn)。例如新聞應(yīng)用在瀏覽內(nèi)容的時(shí)候,可以進(jìn)行多頁(yè)面的跳轉(zhuǎn)使用。圖1

單UIAbility應(yīng)用和多UIAbility應(yīng)用UIAbility內(nèi)頁(yè)面的跳轉(zhuǎn)和數(shù)據(jù)傳遞UIAbility的數(shù)據(jù)傳遞包括有UIAbility內(nèi)頁(yè)面的跳轉(zhuǎn)和數(shù)據(jù)傳遞、UIAbility間的數(shù)據(jù)跳轉(zhuǎn)和數(shù)據(jù)傳遞,本章節(jié)主要講解UIAbility內(nèi)頁(yè)面的跳轉(zhuǎn)和數(shù)據(jù)傳遞。在一個(gè)應(yīng)用包含一個(gè)UIAbility的場(chǎng)景下,可以通過(guò)新建多個(gè)頁(yè)面來(lái)實(shí)現(xiàn)和豐富應(yīng)用的內(nèi)容。這會(huì)涉及到UIAbility內(nèi)頁(yè)面的新建以及UIAbility內(nèi)頁(yè)面的跳轉(zhuǎn)和數(shù)據(jù)傳遞。打開(kāi)DevEcoStudio,選擇一個(gè)EmptyAbility工程模板,創(chuàng)建一個(gè)工程,例如命名為MyApplication。在src/main/ets/entryability目錄下,初始會(huì)生成一個(gè)UIAbility文件EntryAbility.ts。可以在EntryAbility.ts文件中根據(jù)業(yè)務(wù)需要實(shí)現(xiàn)UIAbility的生命周期回調(diào)內(nèi)容。在src/main/ets/pages目錄下,會(huì)生成一個(gè)Index頁(yè)面。這也是基于UIAbility實(shí)現(xiàn)的應(yīng)用的入口頁(yè)面。可以在Index頁(yè)面中根據(jù)業(yè)務(wù)需要實(shí)現(xiàn)入口頁(yè)面的功能。在src/main/ets/pages目錄下,右鍵New->Page,新建一個(gè)Second頁(yè)面,用于實(shí)現(xiàn)頁(yè)面間的跳轉(zhuǎn)和數(shù)據(jù)傳遞。為了實(shí)現(xiàn)頁(yè)面的跳轉(zhuǎn)和數(shù)據(jù)傳遞,需要新建一個(gè)頁(yè)面。在原有Index頁(yè)面的基礎(chǔ)上,新建一個(gè)頁(yè)面,例如命名為Second.ets。頁(yè)面間的導(dǎo)航可以通過(guò)頁(yè)面路由router模塊來(lái)實(shí)現(xiàn)。頁(yè)面路由模塊根據(jù)頁(yè)面url找到目標(biāo)頁(yè)面,從而實(shí)現(xiàn)跳轉(zhuǎn)。通過(guò)頁(yè)面路由模塊,可以使用不同的url訪問(wèn)不同的頁(yè)面,包括跳轉(zhuǎn)到UIAbility內(nèi)的指定頁(yè)面、用UIAbility內(nèi)的某個(gè)頁(yè)面替換當(dāng)前頁(yè)面、返回上一頁(yè)面或指定的頁(yè)面等。具體使用方法請(qǐng)參見(jiàn)ohos.router(頁(yè)面路由)。頁(yè)面跳轉(zhuǎn)和參數(shù)接收在使用頁(yè)面路由之前,需要先導(dǎo)入router模塊,如下代碼所示。import

router

from

'@ohos.router';頁(yè)面跳轉(zhuǎn)的幾種方式,根據(jù)需要選擇一種方式跳轉(zhuǎn)即可。方式一:API9及以上,router.pushUrl()方法新增了mode參數(shù),可以將mode參數(shù)配置為router.RouterMode.Single單實(shí)例模式和router.RouterMode.Standard多實(shí)例模式。在單實(shí)例模式下:如果目標(biāo)頁(yè)面的url在頁(yè)面棧中已經(jīng)存在同url頁(yè)面,離棧頂最近同url頁(yè)面會(huì)被移動(dòng)到棧頂,移動(dòng)后的頁(yè)面為新建頁(yè),原來(lái)的頁(yè)面仍然存在棧中,頁(yè)面棧的元素?cái)?shù)量不變;如果目標(biāo)頁(yè)面的url在頁(yè)面棧中不存在同url頁(yè)面,按多實(shí)例模式跳轉(zhuǎn),頁(yè)面棧的元素?cái)?shù)量會(huì)加1。說(shuō)明:當(dāng)頁(yè)面棧的元素?cái)?shù)量較大或者超過(guò)32時(shí),可以通過(guò)調(diào)用router.clear()方法清除頁(yè)面棧中的所有歷史頁(yè)面,僅保留當(dāng)前頁(yè)面作為棧頂頁(yè)面。router.pushUrl({

url:

'pages/Second',

params:

{

src:

'Index頁(yè)面?zhèn)鱽?lái)的數(shù)據(jù)',

}

},

router.RouterMode.Single)方式二:API9及以上,router.replaceUrl()方法新增了mode參數(shù),可以將mode參數(shù)配置為router.RouterMode.Single單實(shí)例模式和router.RouterMode.Standard多實(shí)例模式。在單實(shí)例模式下:如果目標(biāo)頁(yè)面的url在頁(yè)面棧中已經(jīng)存在同url頁(yè)面,離棧頂最近同url頁(yè)面會(huì)被移動(dòng)到棧頂,替換當(dāng)前頁(yè)面,并銷(xiāo)毀被替換的當(dāng)前頁(yè)面,移動(dòng)后的頁(yè)面為新建頁(yè),頁(yè)面棧的元素?cái)?shù)量會(huì)減1;如果目標(biāo)頁(yè)面的url在頁(yè)面棧中不存在同url頁(yè)面,按多實(shí)例模式跳轉(zhuǎn),頁(yè)面棧的元素?cái)?shù)量不變。router.replaceUrl({

url:

'pages/Second',

params:

{

src:

'Index頁(yè)面?zhèn)鱽?lái)的數(shù)據(jù)',

}

},

router.RouterMode.Single)已經(jīng)實(shí)現(xiàn)了頁(yè)面的跳轉(zhuǎn),接下來(lái),在Second頁(yè)面中如何進(jìn)行自定義參數(shù)的接收呢?通過(guò)調(diào)用router.getParams()方法獲取Index頁(yè)面?zhèn)鬟f過(guò)來(lái)的自定義參數(shù)。import

router

from

'@ohos.router';

@Entry

@Component

struct

Second

{

@State

src:

string

=

(router.getParams()

as

Record<string,

string>)['src'];

//

頁(yè)面刷新展示

...

}效果示意如下圖所示。在Index頁(yè)面中,點(diǎn)擊“Next”后,即可從Index頁(yè)面跳轉(zhuǎn)到Second頁(yè)面,并在Second頁(yè)面中接收參數(shù)和進(jìn)行頁(yè)面刷新展示。圖2

Index頁(yè)面跳轉(zhuǎn)到Second頁(yè)面頁(yè)面返回和參數(shù)接收經(jīng)常還會(huì)遇到一個(gè)場(chǎng)景,在Second頁(yè)面中,完成了一些功能操作之后,希望能返回到Index頁(yè)面,那我們要如何實(shí)現(xiàn)呢?在Second頁(yè)面中,可以通過(guò)調(diào)用router.back()方法實(shí)現(xiàn)返回到上一個(gè)頁(yè)面,或者在調(diào)用router.back()方法時(shí)增加可選的options參數(shù)(增加url參數(shù))返回到指定頁(yè)面。說(shuō)明調(diào)用router.back()返回的目標(biāo)頁(yè)面需要在頁(yè)面棧中存在才能正常跳轉(zhuǎn)。例如調(diào)用router.pushUrl()方法跳轉(zhuǎn)到Second頁(yè)面,在Second頁(yè)面可以通過(guò)調(diào)用router.back()方法返回到上一個(gè)頁(yè)面。例如調(diào)用router.clear()方法清空了頁(yè)面棧中所有歷史頁(yè)面,僅保留當(dāng)前頁(yè)面,此時(shí)則無(wú)法通過(guò)調(diào)用router.back()方法返回到上一個(gè)頁(yè)面。返回上一個(gè)頁(yè)面。router.back();返回到指定頁(yè)面。router.back({

url:

'pages/Index'

});效果示意如下圖所示。在Second頁(yè)面中,點(diǎn)擊“Back”后,即可從Second頁(yè)面返回到Index頁(yè)面。圖3

Second頁(yè)面返回到Index頁(yè)面頁(yè)面返回可以根據(jù)業(yè)務(wù)需要增加一個(gè)詢問(wèn)對(duì)話框。即在調(diào)用router.back()方法之前,可以先調(diào)用router.enableBackPageAlert()方法開(kāi)啟頁(yè)面返回詢問(wèn)對(duì)話框功能。說(shuō)明router.enableBackPageAlert()方法開(kāi)啟頁(yè)面返回詢問(wèn)對(duì)話框功能,只針對(duì)當(dāng)前頁(yè)面生效。例如在調(diào)用router.pushUrl()或者router.replaceUrl()方法,跳轉(zhuǎn)后的頁(yè)面均為新建頁(yè)面,因此在頁(yè)面返回之前均需要先調(diào)用router.enableBackPageAlert()方法之后,頁(yè)面返回詢問(wèn)對(duì)話框功能才會(huì)生效。如需關(guān)閉頁(yè)面返回詢問(wèn)對(duì)話框功能,可以通過(guò)調(diào)用router.disableAlertBeforeBackPage()方法關(guān)閉該功能即可。router.enableBackPageAlert({

message:

'Message

Info'

});

router.back();在Second頁(yè)面中,調(diào)用router.back()方法返回上一個(gè)頁(yè)面或者返回指定頁(yè)面時(shí),根據(jù)需要繼續(xù)增加自定義參數(shù),例如在返回時(shí)增加一個(gè)自定義參數(shù)src。router.back({

url:

'pages/Index',

params:

{

src:

'Second頁(yè)面?zhèn)鱽?lái)的數(shù)據(jù)',

}

})從Second頁(yè)面返回到Index頁(yè)面。在Index頁(yè)面通過(guò)調(diào)用router.getParams()方法,獲取Second頁(yè)面?zhèn)鬟f過(guò)來(lái)的自定義參數(shù)。說(shuō)明調(diào)用router.back()方法,不會(huì)新建頁(yè)面,返回的是原來(lái)的頁(yè)面,在原來(lái)頁(yè)面中@State聲明的變量不會(huì)重復(fù)聲明,以及也不會(huì)觸發(fā)頁(yè)面的aboutToAppear()生命周期回調(diào),因此無(wú)法直接在變量聲明以及頁(yè)面的aboutToAppear()生命周期回調(diào)中接收和解析router.back()傳遞過(guò)來(lái)的自定義參數(shù)??梢苑旁跇I(yè)務(wù)需要的位置進(jìn)行參數(shù)解析。示例代碼在Index頁(yè)面中的onPageShow()生命周期回調(diào)中進(jìn)行參數(shù)的解析。import

router

from

'@ohos.router';

@Entry

@Component

struct

Index

{

@State

src:

string

=

'';

onPageShow()

{

this.src

=

(router.getParams()

as

Record<string,

string>)['src'];

}

//

頁(yè)面刷新展示

...

}效果示意圖如下圖所示。在Second頁(yè)面中,點(diǎn)擊“Back”后,即可從Second頁(yè)面返回到Index頁(yè)面,并在Index頁(yè)面中接收參數(shù)和進(jìn)行頁(yè)面刷新展示。圖4

Second頁(yè)面帶參數(shù)返回Index頁(yè)面UIAbility的生命周期當(dāng)用戶瀏覽、切換和返回到對(duì)應(yīng)應(yīng)用的時(shí)候,應(yīng)用中的UIAbility實(shí)例會(huì)在其生命周期的不同狀態(tài)之間轉(zhuǎn)換。UIAbility類(lèi)提供了很多回調(diào),通過(guò)這些回調(diào)可以知曉當(dāng)前UIAbility的某個(gè)狀態(tài)已經(jīng)發(fā)生改變:例如UIAbility的創(chuàng)建和銷(xiāo)毀,或者UIAbility發(fā)生了前后臺(tái)的狀態(tài)切換。例如從桌面點(diǎn)擊圖庫(kù)應(yīng)用圖標(biāo),到啟動(dòng)圖庫(kù)應(yīng)用,應(yīng)用的狀態(tài)經(jīng)過(guò)了從創(chuàng)建到前臺(tái)展示的狀態(tài)變化。如下圖所示。圖5

從桌面點(diǎn)擊圖庫(kù)應(yīng)用圖標(biāo)啟動(dòng)應(yīng)用回到桌面,從最近任務(wù)列表,切換回到圖庫(kù)應(yīng)用,應(yīng)用的狀態(tài)經(jīng)過(guò)了從后臺(tái)到前臺(tái)展示的狀態(tài)變化。如下圖所示。圖6

從最近任務(wù)列表切換回到圖庫(kù)應(yīng)用在UIAbility的使用過(guò)程中,會(huì)有多種生命周期狀態(tài)。掌握UIAbility的生命周期,對(duì)于應(yīng)用的開(kāi)發(fā)非常重要。為了實(shí)現(xiàn)多設(shè)備形態(tài)上的裁剪和多窗口的可擴(kuò)展性,系統(tǒng)對(duì)組件管理和窗口管理進(jìn)行了解耦。UIAbility的生命周期包括Create、Foreground、Background、Destroy四個(gè)狀態(tài),WindowStageCreate和WindowStageDestroy為窗口管理器(WindowStage)在UIAbility中管理UI界面功能的兩個(gè)生命周期回調(diào),從而實(shí)現(xiàn)UIAbility與窗口之間的弱耦合。如下圖所示。圖7

UIAbility生命周期狀態(tài)Create狀態(tài),在UIAbility實(shí)例創(chuàng)建時(shí)觸發(fā),系統(tǒng)會(huì)調(diào)用onCreate回調(diào)??梢栽趏nCreate回調(diào)中進(jìn)行相關(guān)初始化操作。import

UIAbility

from

'@ohos.app.ability.UIAbility';

import

window

from

'@ohos.window';

export

default

class

EntryAbility

extends

UIAbility

{

onCreate(want:

Want,

launchParam:

AbilityConstant.LaunchParam)

{

//

應(yīng)用初始化

...

}

...

}例如用戶打開(kāi)電池管理應(yīng)用,在應(yīng)用加載過(guò)程中,在UI頁(yè)面可見(jiàn)之前,可以在onCreate回調(diào)中讀取當(dāng)前系統(tǒng)的電量情況,用于后續(xù)的UI頁(yè)面展示。UIAbility實(shí)例創(chuàng)建完成之后,在進(jìn)入Foreground之前,系統(tǒng)會(huì)創(chuàng)建一個(gè)WindowStage。每一個(gè)UIAbility實(shí)例都對(duì)應(yīng)持有一個(gè)WindowStage實(shí)例。WindowStage為本地窗口管理器,用于管理窗口相關(guān)的內(nèi)容,例如與界面相關(guān)的獲焦/失焦、可見(jiàn)/不可見(jiàn)??梢栽趏nWindowStageCreate回調(diào)中,設(shè)置UI頁(yè)面加載、設(shè)置WindowStage的事件訂閱。在onWindowStageCreate(windowStage)中通過(guò)loadContent接口設(shè)置應(yīng)用要加載的頁(yè)面,Window接口的使用詳見(jiàn)窗口開(kāi)發(fā)指導(dǎo)。import

UIAbility

from

'@ohos.app.ability.UIAbility';

import

window

from

'@ohos.window';

export

default

class

EntryAbility

extends

UIAbility

{

...

onWindowStageCreate(windowStage:

window.WindowStage)

{

//

設(shè)置UI頁(yè)面加載

//

設(shè)置WindowStage的事件訂閱(獲焦/失焦、可見(jiàn)/不可見(jiàn))

...

windowStage.loadContent('pages/Index',

(err,

data)

=>

{

...

});

}

...

}例如用戶打開(kāi)游戲應(yīng)用,正在打游戲的時(shí)候,有一個(gè)消息通知,打開(kāi)消息,消息會(huì)以彈窗的形式彈出在游戲應(yīng)用的上方,此時(shí),游戲應(yīng)用就從獲焦切換到了失焦?fàn)顟B(tài),消息應(yīng)用切換到了獲焦?fàn)顟B(tài)。對(duì)于消息應(yīng)用,在onWindowStageCreate回調(diào)中,會(huì)觸發(fā)獲焦的事件回調(diào),可以進(jìn)行設(shè)置消息應(yīng)用的背景顏色、高亮等操作。Foreground和Background狀態(tài),分別在UIAbility切換至前臺(tái)或者切換至后臺(tái)時(shí)觸發(fā)。分別對(duì)應(yīng)于onForeground回調(diào)和onBackground回調(diào)。onForeground回調(diào),在UIAbility的UI頁(yè)面可見(jiàn)之前,即UIAbility切換至前臺(tái)時(shí)觸發(fā)??梢栽趏nForeground回調(diào)中申請(qǐng)系統(tǒng)需要的資源,或者重新申請(qǐng)?jiān)趏nBackground中釋放的資源。onBackground回調(diào),在UIAbility的UI頁(yè)面完全不可見(jiàn)之后,即UIAbility切換至后臺(tái)時(shí)候觸發(fā)??梢栽趏nBackground回調(diào)中釋放UI頁(yè)面不可見(jiàn)時(shí)無(wú)用的資源,或者在此回調(diào)中執(zhí)行較為耗時(shí)的操作,例如狀態(tài)保存等。import

UIAbility

from

'@ohos.app.ability.UIAbility';

import

window

from

'@ohos.window';

export

default

class

EntryAbility

extends

UIAbility

{

...

onForeground()

{

//

申請(qǐng)系統(tǒng)需要的資源,或者重新申請(qǐng)?jiān)趏nBackground中釋放的資源

...

}

onBackground()

{

//

釋放UI頁(yè)面不可見(jiàn)時(shí)無(wú)用的資源,或者在此回調(diào)中執(zhí)行較為耗時(shí)的操作

//

例如狀態(tài)保存等

...

}

}例如用戶打開(kāi)地圖應(yīng)用查看當(dāng)前地理位置的時(shí)候,假設(shè)地圖應(yīng)用已獲得用戶的定位權(quán)限授權(quán)。在UI頁(yè)面顯示之前,可以在onForeground回調(diào)中打開(kāi)定位功能,從而獲取到當(dāng)前的位置信息。當(dāng)?shù)貓D應(yīng)用切換到后臺(tái)狀態(tài),可以在onBackground回調(diào)中停止定位功能,以節(jié)省系統(tǒng)的資源消耗。前面我們了解了UIAbility實(shí)例創(chuàng)建時(shí)的onWindowStageCreate回調(diào)的相關(guān)作用。對(duì)應(yīng)于onWindowStageCreate回調(diào)。在UIAbility實(shí)例銷(xiāo)毀之前,則會(huì)先進(jìn)入onWindowStageDestroy回調(diào),我們可以在該回調(diào)中釋放UI頁(yè)面資源。import

UIAbility

from

'@ohos.app.ability.UIAbility';

import

window

from

'@ohos.window';

export

default

class

EntryAbility

extends

UIAbility

{

...

onWindowStageDestroy()

{

//

釋放UI頁(yè)面資源

...

}

}例如在onWindowStageCreate中設(shè)置的獲焦/失焦等WindowStage訂閱事件。Destroy狀態(tài),在UIAbility銷(xiāo)毀時(shí)觸發(fā)??梢栽趏nDestroy回調(diào)中進(jìn)行系統(tǒng)資源的釋放、數(shù)據(jù)的保存等操作。import

UIAbility

from

'@ohos.app.ability.UIAbility';

import

window

from

'@ohos.window';

export

default

class

EntryAbility

extends

UIAbility

{

...

onDestroy()

{

//

系統(tǒng)資源的釋放、數(shù)據(jù)的保存等

...

}

}例如用戶使用應(yīng)用的程序退出功能,會(huì)調(diào)用UIAbilityContext的terminalSelf()方法,從而完成UIAbility銷(xiāo)毀?;蛘哂脩羰褂米罱蝿?wù)列表關(guān)閉該UIAbility實(shí)例時(shí),也會(huì)完成UIAbility的銷(xiāo)毀。UIAbility的啟動(dòng)模式對(duì)于瀏覽器或者新聞等應(yīng)用,用戶在打開(kāi)該應(yīng)用,并瀏覽訪問(wèn)相關(guān)內(nèi)容后,回到桌面,再次打開(kāi)該應(yīng)用,顯示的仍然是用戶當(dāng)前訪問(wèn)的界面。對(duì)于應(yīng)用的分屏操作,用戶希望使用兩個(gè)不同應(yīng)用(例如備忘錄應(yīng)用和圖庫(kù)應(yīng)用)之間進(jìn)行分屏,也希望能使用同一個(gè)應(yīng)用(例如備忘錄應(yīng)用自身)進(jìn)行分屏。對(duì)于文檔應(yīng)用,用戶從文檔應(yīng)用中打開(kāi)一個(gè)文檔內(nèi)容,回到文檔應(yīng)用,繼續(xù)打開(kāi)同一個(gè)文檔,希望打開(kāi)的還是同一個(gè)文檔內(nèi)容。基于以上場(chǎng)景的考慮,UIAbility當(dāng)前支持singleton(單實(shí)例模式)、multiton(多實(shí)例模式)和specified(指定實(shí)例模式)3種啟動(dòng)模式。對(duì)啟動(dòng)模式的詳細(xì)說(shuō)明如下:singleton(單實(shí)例模式)當(dāng)用戶打開(kāi)瀏覽器或者新聞等應(yīng)用,并瀏覽訪問(wèn)相關(guān)內(nèi)容后,回到桌面,再次打開(kāi)該應(yīng)用,顯示的仍然是用戶當(dāng)前訪問(wèn)的界面。這種情況下可以將UIAbility配置為singleton(單實(shí)例模式)。每次調(diào)用startAbility()方法時(shí),如果應(yīng)用進(jìn)程中該類(lèi)型的UIAbility實(shí)例已經(jīng)存在,則復(fù)用系統(tǒng)中的UIAbility實(shí)例,系統(tǒng)中只存在唯一一個(gè)該UIAbility實(shí)例。即在最近任務(wù)列表中只存在一個(gè)該類(lèi)型的UIAbility實(shí)例。multiton(多實(shí)例模式)用戶在使用分屏功能時(shí),希望使用兩個(gè)不同應(yīng)用(例如備忘錄應(yīng)用和圖庫(kù)應(yīng)用)之間進(jìn)行分屏,也希望能使用同一個(gè)應(yīng)用(例如備忘錄應(yīng)用自身)進(jìn)行分屏。這種情況下可以將UIAbility配置為multiton(多實(shí)例模式)。每次調(diào)用startAbility()方法時(shí),都會(huì)在應(yīng)用進(jìn)程中創(chuàng)建一個(gè)該類(lèi)型的UIAbility實(shí)例。即在最近任務(wù)列表中可以看到有多個(gè)該類(lèi)型的UIAbility實(shí)例。specified(指定實(shí)例模式)用戶打開(kāi)文檔應(yīng)用,從文檔應(yīng)用中打開(kāi)一個(gè)文檔內(nèi)容,回到文檔應(yīng)用,繼續(xù)打開(kāi)同一個(gè)文檔,希望打開(kāi)的還是同一個(gè)文檔內(nèi)容;以及在文檔應(yīng)用中新建一個(gè)新的文檔,每次新建文檔,希望打開(kāi)的都是一個(gè)新的空白文檔內(nèi)容。這種情況下可以將UIAbility配置為specified(指定實(shí)例模式)。在UIAbility實(shí)例新創(chuàng)建之前,允許開(kāi)發(fā)者為該實(shí)例創(chuàng)建一個(gè)字符串Key,新創(chuàng)建的UIAbility實(shí)例綁定Key之后,后續(xù)每次調(diào)用startAbility方法時(shí),都會(huì)詢問(wèn)應(yīng)用使用哪個(gè)Key對(duì)應(yīng)的UIAbility實(shí)例來(lái)響應(yīng)startAbility請(qǐng)求。如果匹配有該UIAbility實(shí)例的Key,則直接拉起與之綁定的UIAbility實(shí)例,否則創(chuàng)建一個(gè)新的UIAbility實(shí)例。運(yùn)行時(shí)由UIAbility內(nèi)部業(yè)務(wù)決定是否創(chuàng)建多實(shí)例。singleton啟動(dòng)模式singleton啟動(dòng)模式,也是默認(rèn)情況下的啟動(dòng)模式。singleton啟動(dòng)模式,每次調(diào)用startAbility()啟動(dòng)UIAbility時(shí),如果應(yīng)用進(jìn)程中該類(lèi)型的UIAbility實(shí)例已經(jīng)存在,則復(fù)用系統(tǒng)中的UIAbility實(shí)例,系統(tǒng)中只存在唯一一個(gè)該UIAbility實(shí)例。singleton啟動(dòng)模式的開(kāi)發(fā)使用,在module.json5文件中的“l(fā)aunchType”字段配置為“singleton”即可。{

"module":

{

...

"abilities":

[

{

"launchType":

"singleton",

...

}

]

}

}multiton啟動(dòng)模式multiton啟動(dòng)模式,每次調(diào)用startAbility()方法時(shí),都會(huì)在應(yīng)用進(jìn)程中創(chuàng)建一個(gè)該類(lèi)型的UIAbility實(shí)例。multiton啟動(dòng)模式的開(kāi)發(fā)使用,在module.json5文件中的“l(fā)aunchType”字段配置為“multiton”即可。{

"module":

{

...

"abilities":

[

{

"launchType":

"multiton",

...

}

]

}

}specified啟動(dòng)模式specified啟動(dòng)模式,根據(jù)業(yè)務(wù)需要是否創(chuàng)建一個(gè)新的UIAbility實(shí)例。在UIAbility實(shí)例創(chuàng)建之前,會(huì)先進(jìn)入AbilityStage的onAcceptWant回調(diào),在onAcceptWant回調(diào)中為每一個(gè)UIAbility實(shí)例創(chuàng)建一個(gè)Key,后續(xù)每次調(diào)用startAbility()方法創(chuàng)建該類(lèi)型的UIAbility實(shí)例都會(huì)詢問(wèn)使用哪個(gè)Key對(duì)應(yīng)的UIAbility實(shí)例來(lái)響應(yīng)startAbility()請(qǐng)求。specified啟動(dòng)模式的開(kāi)發(fā)使用的步驟如下所示。在module.json5文件中的“l(fā)aunchType”字段配置為“specified”。{

"module":

{

...

"abilities":

[

{

"launchType":

"specified",

...

}

]

}

}在調(diào)用startAbility()方法的want參數(shù)中,增加一個(gè)自定義參數(shù)來(lái)區(qū)別UIAbility實(shí)例,例如增加一個(gè)“instanceKey”自定義參數(shù)。//

在啟動(dòng)指定實(shí)例模式的UIAbility時(shí),給每一個(gè)UIAbility實(shí)例配置一個(gè)獨(dú)立的Key標(biāo)識(shí)

function

getInstance()

{

...

}

let

context:common.UIAbilityContext

=

...;

//

context為調(diào)用方UIAbility的UIAbilityContext

let

want:

Want

=

{

deviceId:

'',

//

deviceId為空表示本設(shè)備

bundleName:

'com.exampl

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論