W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
UIAbility的啟動(dòng)模式是指UIAbility實(shí)例在啟動(dòng)時(shí)的不同呈現(xiàn)狀態(tài)。針對不同的業(yè)務(wù)場景,系統(tǒng)提供了三種啟動(dòng)模式:
singleton啟動(dòng)模式為單實(shí)例模式,也是默認(rèn)情況下的啟動(dòng)模式。
每次調(diào)用startAbility()方法時(shí),如果應(yīng)用進(jìn)程中該類型的UIAbility實(shí)例已經(jīng)存在,則復(fù)用系統(tǒng)中的UIAbility實(shí)例。系統(tǒng)中只存在唯一一個(gè)該UIAbility實(shí)例,即在最近任務(wù)列表中只存在一個(gè)該類型的UIAbility實(shí)例。
圖1 單實(shí)例模式演示效果
應(yīng)用的UIAbility實(shí)例已創(chuàng)建,該UIAbility配置為單實(shí)例模式,再次調(diào)用startAbility()方法啟動(dòng)該UIAbility實(shí)例,此時(shí)只會進(jìn)入該UIAbility的onNewWant()回調(diào),不會進(jìn)入其onCreate()和onWindowStageCreate()生命周期回調(diào)。
如果需要使用singleton啟動(dòng)模式,在module.json5配置文件中的"launchType"字段配置為"singleton"即可。
- {
- "module": {
- // ...
- "abilities": [
- {
- "launchType": "singleton",
- // ...
- }
- ]
- }
- }
multiton啟動(dòng)模式為多實(shí)例模式,每次調(diào)用startAbility()方法時(shí),都會在應(yīng)用進(jìn)程中創(chuàng)建一個(gè)新的該類型UIAbility實(shí)例。即在最近任務(wù)列表中可以看到有多個(gè)該類型的UIAbility實(shí)例。這種情況下可以將UIAbility配置為multiton(多實(shí)例模式)。
圖2 多實(shí)例模式演示效果
multiton啟動(dòng)模式的開發(fā)使用,在module.json5配置文件中的"launchType"字段配置為"multiton"即可。
- {
- "module": {
- // ...
- "abilities": [
- {
- "launchType": "multiton",
- // ...
- }
- ]
- }
- }
specified啟動(dòng)模式為指定實(shí)例模式,針對一些特殊場景使用(例如文檔應(yīng)用中每次新建文檔希望都能新建一個(gè)文檔實(shí)例,重復(fù)打開一個(gè)已保存的文檔希望打開的都是同一個(gè)文檔實(shí)例)。
在UIAbility實(shí)例創(chuàng)建之前,允許開發(fā)者為該實(shí)例創(chuàng)建一個(gè)唯一的字符串Key,創(chuàng)建的UIAbility實(shí)例綁定Key之后,后續(xù)每次調(diào)用startAbility()方法時(shí),都會詢問應(yīng)用使用哪個(gè)Key對應(yīng)的UIAbility實(shí)例來響應(yīng)startAbility()請求。運(yùn)行時(shí)由UIAbility內(nèi)部業(yè)務(wù)決定是否創(chuàng)建多實(shí)例,如果匹配有該UIAbility實(shí)例的Key,則直接拉起與之綁定的UIAbility實(shí)例,否則創(chuàng)建一個(gè)新的UIAbility實(shí)例。
圖3 指定實(shí)例模式演示效果
應(yīng)用的UIAbility實(shí)例已創(chuàng)建,該UIAbility配置為指定實(shí)例模式,再次調(diào)用startAbility()方法啟動(dòng)該UIAbility實(shí)例,且AbilityStage的onAcceptWant()回調(diào)匹配到一個(gè)已創(chuàng)建的UIAbility實(shí)例。此時(shí),再次啟動(dòng)該UIAbility時(shí),只會進(jìn)入該UIAbility的onNewWant()回調(diào),不會進(jìn)入其onCreate()和onWindowStageCreate()生命周期回調(diào)。
例如有兩個(gè)UIAbility:EntryAbility和FuncAbility,F(xiàn)uncAbility配置為specified啟動(dòng)模式,需要從EntryAbility的頁面中啟動(dòng)FuncAbility。
在FuncAbility中,將module.json5配置文件的"launchType"字段配置為"specified"。
- {
- "module": {
- // ...
- "abilities": [
- {
- "launchType": "specified",
- // ...
- }
- ]
- }
- }
在EntryAbility中,調(diào)用startAbility()方法時(shí),在want參數(shù)中,增加一個(gè)自定義參數(shù)來區(qū)別UIAbility實(shí)例,例如增加一個(gè)"instanceKey"自定義參數(shù)。
- // 在啟動(dòng)指定實(shí)例模式的UIAbility時(shí),給每一個(gè)UIAbility實(shí)例配置一個(gè)獨(dú)立的Key標(biāo)識
- // 例如在文檔使用場景中,可以用文檔路徑作為Key標(biāo)識
- function getInstance() {
- // ...
- }
- let want = {
- deviceId: '', // deviceId為空表示本設(shè)備
- bundleName: 'com.example.myapplication',
- abilityName: 'FuncAbility',
- moduleName: 'module1', // moduleName非必選
- parameters: { // 自定義信息
- instanceKey: getInstance(),
- },
- }
- // context為調(diào)用方UIAbility的AbilityContext
- this.context.startAbility(want).then(() => {
- // ...
- }).catch((err) => {
- // ...
- })
由于FuncAbility的啟動(dòng)模式配置為了指定實(shí)例啟動(dòng)模式,在FuncAbility啟動(dòng)之前,會先進(jìn)入其對應(yīng)的AbilityStage的onAcceptWant()生命周期回調(diào)中,解析傳入的want參數(shù),獲取"instanceKey"自定義參數(shù)。根據(jù)業(yè)務(wù)需要通過AbilityStage的onAcceptWant()生命周期回調(diào)返回一個(gè)字符串Key標(biāo)識。如果返回的Key對應(yīng)一個(gè)已啟動(dòng)的UIAbility,則會將之前的UIAbility拉回前臺并獲焦,而不創(chuàng)建新的實(shí)例,否則創(chuàng)建新的實(shí)例并啟動(dòng)。
- import AbilityStage from '@ohos.app.ability.AbilityStage';
- export default class MyAbilityStage extends AbilityStage {
- onAcceptWant(want): string {
- // 在被調(diào)用方的AbilityStage中,針對啟動(dòng)模式為specified的UIAbility返回一個(gè)UIAbility實(shí)例對應(yīng)的一個(gè)Key值
- // 當(dāng)前示例指的是module1 Module的FuncAbility
- if (want.abilityName === 'FuncAbility') {
- // 返回的字符串Key標(biāo)識為自定義拼接的字符串內(nèi)容
- return `ControlModule_EntryAbilityInstance_${want.parameters.instanceKey}`;
- }
- return '';
- }
- }
例如在文檔應(yīng)用中,可以對不同的文檔實(shí)例內(nèi)容綁定不同的Key值。當(dāng)每次新建文檔的時(shí)候,可以傳入不同的新Key值(如可以將文件的路徑作為一個(gè)Key標(biāo)識),此時(shí)AbilityStage中啟動(dòng)UIAbility時(shí)都會創(chuàng)建一個(gè)新的UIAbility實(shí)例;當(dāng)新建的文檔保存之后,回到桌面,或者新打開一個(gè)已保存的文檔,回到桌面,此時(shí)再次打開該已保存的文檔,此時(shí)AbilityStage中再次啟動(dòng)該UIAbility時(shí),打開的仍然是之前原來已保存的文檔界面。
以如下步驟所示進(jìn)行舉例說明。
打開文件A,對應(yīng)啟動(dòng)一個(gè)新的UIAbility實(shí)例,例如啟動(dòng)“UIAbility實(shí)例1”。
在最近任務(wù)列表中關(guān)閉文件A的進(jìn)程,此時(shí)UIAbility實(shí)例1被銷毀,回到桌面,再次打開文件A,此時(shí)對應(yīng)啟動(dòng)一個(gè)新的UIAbility實(shí)例,例如啟動(dòng)“UIAbility實(shí)例2”。
回到桌面,打開文件B,此時(shí)對應(yīng)啟動(dòng)一個(gè)新的UIAbility實(shí)例,例如啟動(dòng)“UIAbility實(shí)例3”。
回到桌面,再次打開文件A,此時(shí)對應(yīng)啟動(dòng)的還是之前的“UIAbility實(shí)例2”。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: