Stage 模型這樣的應用,它在啟動的時候會先準備 Ability Stage 舞臺,接著呢,就可以基于它去創建 UIAbility 的實例,并去啟動它。
UIAbility 組件啟動模式 有四種:
- singleton
- standard
- multiton
- specified
修改模塊的 module.json5
來改變啟動模式:
{"module": {..."abilities": [{..."launchType": "singleton",...}]}
}
一、singleton 啟動模式
👉 官方文檔
singleton 是單實例的意思,所以這種模式對應的 UIAbility 不管你給它啟動多少次,它只會存在唯一的實例。事實上,我們的應用默認 Ability 都是這種模式。
UIAbility 的實例其實對應到操作系統任務列表中的一個任務。所以,如果你的 Ability 是 singleton 這種模式,不管啟動多少次,去查看手機的任務列表,會發現這個 Ability 在任務列表中只會存在一個任務。
運行日志:
-
點擊圖標啟動 app:
Ability onCreate Ability onWindowStageCreate Ability onForeground
-
點擊 Home 回到桌面:
Ability onBackground
-
再次點擊圖標啟動 app:
Ability onForeground
二、standard、multiton 啟動模式
👉 官方文檔
在官網上管 standard 模式叫 multiton 模式,但是經過測試,這兩種模式是不一樣的。但是這兩個模式又非常接近,這兩種模式在每次啟動 UIAbility 時都會創建一個新實例。
在 standard 模式當中,創建一個新的實例,之前那個舊的實例也會存在,也就是多個實例并存;而 multiton 模式則不一樣,它在每次創建一個新實例,舊的實例則會被移除。
對于 standard 模式來講,每創建一個新的實例,都會存在,那是不是意味著同一個 Ability 它的多個實例是并存的。因此在任務列表中會發現一個 Ability 可能會存在一個或多個任務。
multiton 運行日志:
-
點擊圖標啟動 app:
Ability onCreate Ability onWindowStageCreate Ability onForeground
-
點擊 Home 回到桌面:
Ability onBackground
-
再次點擊圖標啟動 app:
Ability onCreate Ability onWindowStageCreate Ability onForeground
-
點擊任務列表
發現 App 只存在一個實例
standard 運行日志:
-
點擊圖標啟動 app:
Ability onCreate Ability onWindowStageCreate Ability onForeground
-
點擊 Home 回到桌面:
Ability onBackground
-
再次點擊圖標啟動 app:
Ability onCreate Ability onWindowStageCreate Ability onForeground
-
點擊任務列表
發現 App 存在兩個實例
三、specified 啟動模式
👉 官方文檔
specified 顧名思義就是指定的意思,在使用這種模式時,啟動一個 UIAbility 時是需要指定一個 key,這個 key 會作為 UIAbility 實例的一個唯一標識。
所以,當啟動時,會先看一下指定的這個 key 對應的 UIAbility 是否存在。如果不存在,就會創建一個新的 UIAbility 實例,然后把這個 key 作為這個實例的標識,下次再啟動 UIAbility 時,還需要指定 key,還需要判斷這個 key 對應的實例是否已經存在。如果已經存在,就可以直接把它喚醒,不用重新創建。
這種模式和 standard 模式有點像,就是一個 Ability 會存在多個實例,但是呢又不一樣,在創建實例時可以指定 key,key 不存在才需要創建,key 存在就不用重復創建了,這樣就可以快速的找到以前創建好的實例。
當前 UIAbility 調用 startAbility 方法拉起目標 UIAbility:
// 獲取上下文
context = getContext(this) as common.UIAbilityContext// 指定要跳轉到 UIAbility 的信息
let want = {deviceId: '',bundleName: 'com.tyhoo.hmos.myapplication',abilityName: 'TestAbility',moduleName: 'entry',parameters: {instanceKey: this.getInstanceKey()}
}// 嘗試拉起目標 UIAbility 實例
this.context.startAbility(want)
-
調用一個全局的 getContext 方法,來獲取 UIAbilityContext 的上下文對象。
-
拿到上下文之后,可以調用它的 startAbility 方法,從而來去拉起一個目標的 UIAbility,或者說把它的實例給創建好。
-
傳入參數 want 來告訴具體拉起哪個實例。
- deviceId:設備信息。如果什么都不傳,代表的是本設備。
- bundleName:包名/應用名。它是設備的唯一標識。
- abilityName:目標 UIAbility 的名稱。
- moduleName:模塊名。調用的 Ability 在哪個模塊。
- parameters:參數。
在 AbilityStage 的生命周期回調中為目標 UIAbility 實例生成 key:
export default class MyAbilityStage extends AbilityStage {onAcceptWant(want: Want): string {if (want.abilityName === 'TestAbility') {return `TestAbility_${want.parameters.instanceKey}`}return '';}
}
在 module.json5 配置文件中,通過 srcEntry 參數指定 AbilityStage 路徑:
{"module": {..."srcEntry": "./ets/myabilitystage/MyAbilityStage.ts"}
}