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