UIAbility組件啟動模式

2024-01-25 12:14 更新

UIAbility的啟動模式是指UIAbility實例在啟動時的不同呈現(xiàn)狀態(tài)。針對不同的業(yè)務(wù)場景,系統(tǒng)提供了三種啟動模式:

singleton啟動模式

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"即可。

  1. {
  2. "module": {
  3. // ...
  4. "abilities": [
  5. {
  6. "launchType": "singleton",
  7. // ...
  8. }
  9. ]
  10. }
  11. }

multiton啟動模式

multiton啟動模式為多實例模式,每次調(diào)用startAbility()方法時,都會在應(yīng)用進(jìn)程中創(chuàng)建一個新的該類型UIAbility實例。即在最近任務(wù)列表中可以看到有多個該類型的UIAbility實例。這種情況下可以將UIAbility配置為multiton(多實例模式)。

圖2 多實例模式演示效果

multiton啟動模式的開發(fā)使用,在module.json5配置文件中的"launchType"字段配置為"multiton"即可。

  1. {
  2. "module": {
  3. // ...
  4. "abilities": [
  5. {
  6. "launchType": "multiton",
  7. // ...
  8. }
  9. ]
  10. }
  11. }

specified啟動模式

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實例,且AbilityStageonAcceptWant()回調(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。

  1. 在FuncAbility中,將module.json5配置文件的"launchType"字段配置為"specified"。

    1. {
    2. "module": {
    3. // ...
    4. "abilities": [
    5. {
    6. "launchType": "specified",
    7. // ...
    8. }
    9. ]
    10. }
    11. }
  2. 在EntryAbility中,調(diào)用startAbility()方法時,在want參數(shù)中,增加一個自定義參數(shù)來區(qū)別UIAbility實例,例如增加一個"instanceKey"自定義參數(shù)。

    1. // 在啟動指定實例模式的UIAbility時,給每一個UIAbility實例配置一個獨立的Key標(biāo)識
    2. // 例如在文檔使用場景中,可以用文檔路徑作為Key標(biāo)識
    3. function getInstance() {
    4. // ...
    5. }
    6. let want = {
    7. deviceId: '', // deviceId為空表示本設(shè)備
    8. bundleName: 'com.example.myapplication',
    9. abilityName: 'FuncAbility',
    10. moduleName: 'module1', // moduleName非必選
    11. parameters: { // 自定義信息
    12. instanceKey: getInstance(),
    13. },
    14. }
    15. // context為調(diào)用方UIAbility的AbilityContext
    16. this.context.startAbility(want).then(() => {
    17. // ...
    18. }).catch((err) => {
    19. // ...
    20. })
  3. 由于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)建新的實例并啟動。

    1. import AbilityStage from '@ohos.app.ability.AbilityStage';
    2. export default class MyAbilityStage extends AbilityStage {
    3. onAcceptWant(want): string {
    4. // 在被調(diào)用方的AbilityStage中,針對啟動模式為specified的UIAbility返回一個UIAbility實例對應(yīng)的一個Key值
    5. // 當(dāng)前示例指的是module1 Module的FuncAbility
    6. if (want.abilityName === 'FuncAbility') {
    7. // 返回的字符串Key標(biāo)識為自定義拼接的字符串內(nèi)容
    8. return `ControlModule_EntryAbilityInstance_${want.parameters.instanceKey}`;
    9. }
    10. return '';
    11. }
    12. }

    例如在文檔應(yīng)用中,可以對不同的文檔實例內(nèi)容綁定不同的Key值。當(dāng)每次新建文檔的時候,可以傳入不同的新Key值(如可以將文件的路徑作為一個Key標(biāo)識),此時AbilityStage中啟動UIAbility時都會創(chuàng)建一個新的UIAbility實例;當(dāng)新建的文檔保存之后,回到桌面,或者新打開一個已保存的文檔,回到桌面,此時再次打開該已保存的文檔,此時AbilityStage中再次啟動該UIAbility時,打開的仍然是之前原來已保存的文檔界面。

    以如下步驟所示進(jìn)行舉例說明。

    1. 打開文件A,對應(yīng)啟動一個新的UIAbility實例,例如啟動“UIAbility實例1”。

    2. 在最近任務(wù)列表中關(guān)閉文件A的進(jìn)程,此時UIAbility實例1被銷毀,回到桌面,再次打開文件A,此時對應(yīng)啟動一個新的UIAbility實例,例如啟動“UIAbility實例2”。

    3. 回到桌面,打開文件B,此時對應(yīng)啟動一個新的UIAbility實例,例如啟動“UIAbility實例3”。

    4. 回到桌面,再次打開文件A,此時對應(yīng)啟動的還是之前的“UIAbility實例2”。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號