0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙Ability Kit(程序框架服務(wù))【UIAbility組件啟動(dòng)模式】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-06-06 11:05 ? 次閱讀

UIAbility組件啟動(dòng)模式

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

singleton啟動(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í)例模式演示效果
uiability-launch-type1

說明
開發(fā)前請(qǐng)熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]
應(yīng)用的UIAbility實(shí)例已創(chuàng)建,該UIAbility配置為單實(shí)例模式,再次調(diào)用[startAbility()]方法啟動(dòng)該UIAbility實(shí)例。由于啟動(dòng)的還是原來的UIAbility實(shí)例,并未重新創(chuàng)建一個(gè)新的UIAbility實(shí)例,此時(shí)只會(huì)進(jìn)入該UIAbility的[onNewWant()]回調(diào),不會(huì)進(jìn)入其[onCreate()]和[onWindowStageCreate()]生命周期回調(diào)。

如果需要使用singleton啟動(dòng)模式,在[module.json5配置文件]中的launchType字段配置為singleton即可。

{
  "module": {
    ...
    "abilities": [
      {
        "launchType": "singleton",
        ...
      }
    ]
  }
}

multiton啟動(dòng)模式

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

圖2 多實(shí)例模式演示效果
uiability-launch-type2

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

{
  "module": {
    ...
    "abilities": [
      {
        "launchType": "multiton",
        ...
      }
    ]
  }
}

specified啟動(dòng)模式

specified啟動(dòng)模式為指定實(shí)例模式,針對(duì)一些特殊場(chǎng)景使用(例如文檔應(yīng)用中每次新建文檔希望都能新建一個(gè)文檔實(shí)例,重復(fù)打開一個(gè)已保存的文檔希望打開的都是同一個(gè)文檔實(shí)例)。

圖3 指定實(shí)例模式演示效果
uiability-launch-type3

例如有兩個(gè)UIAbility:EntryAbility和SpecifiedAbility,SpecifiedAbility配置為指定實(shí)例模式啟動(dòng),需要從EntryAbility的頁(yè)面中啟動(dòng)SpecifiedAbility。

  1. 在SpecifiedAbility中,將[module.json5配置文件]的launchType字段配置為specified。
    {
      "module": {
        ...
        "abilities": [
          {
            "launchType": "specified",
            ...
          }
        ]
      }
    }
    
  2. 在創(chuàng)建UIAbility實(shí)例之前,開發(fā)者可以為該實(shí)例指定一個(gè)唯一的字符串Key,這樣在調(diào)用[startAbility()]方法時(shí),應(yīng)用就可以根據(jù)指定的Key來識(shí)別響應(yīng)請(qǐng)求的UIAbility實(shí)例。在EntryAbility中,調(diào)用[startAbility()]方法時(shí),可以在want參數(shù)中增加一個(gè)自定義參數(shù),例如instanceKey,以此來區(qū)分不同的UIAbility實(shí)例。
    // 在啟動(dòng)指定實(shí)例模式的UIAbility時(shí),給每一個(gè)UIAbility實(shí)例配置一個(gè)獨(dú)立的Key標(biāo)識(shí)
     // 例如在文檔使用場(chǎng)景中,可以用文檔路徑作為Key標(biāo)識(shí)
     import common from '@ohos.app.ability.common';
     import hilog from '@ohos.hilog';
     import Want from '@ohos.app.ability.Want';
     import { BusinessError } from '@ohos.base';
    
     const TAG: string = '[Page_StartModel]';
     const DOMAIN_NUMBER: number = 0xFF00;
    
     function getInstance() : string {
       return 'KEY';
     }
    
     @Entry
     @Component
     struct Page_StartModel {
       private KEY_NEW = 'KEY';
       build() {
         Row() {
           Column() {
             // ...
             Button()
             // ...
             .onClick(() = > {
               let context:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
               // context為調(diào)用方UIAbility的UIAbilityContext;
               let want: Want = {
                 deviceId: '', // deviceId為空表示本設(shè)備
                 bundleName: 'com.samples.stagemodelabilitydevelop',
                 abilityName: 'SpecifiedFirstAbility',
                 moduleName: 'entry', // moduleName非必選
                 parameters: { // 自定義信息
                   instanceKey: this.KEY_NEW
                 }
               };
               context.startAbility(want).then(() = > {
                 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in starting SpecifiedAbility.');
               }).catch((err: BusinessError) = > {
                 hilog.error(DOMAIN_NUMBER, TAG, `Failed to start SpecifiedAbility. Code is ${err.code}, message is ${err.message}`);
               })
               this.KEY_NEW = this.KEY_NEW + 'a';
             })
             // ...
             Button()
             // ...
             .onClick(() = > {
               let context:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
               // context為調(diào)用方UIAbility的UIAbilityContext;
               let want: Want = {
                 deviceId: '', // deviceId為空表示本設(shè)備
                 bundleName: 'com.samples.stagemodelabilitydevelop',
                 abilityName: 'SpecifiedSecondAbility',
                 moduleName: 'entry', // moduleName非必選
                 parameters: { // 自定義信息
                   instanceKey: getInstance()
                 }
               };
               context.startAbility(want).then(() = > {
                 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in starting SpecifiedAbility.');
               }).catch((err: BusinessError) = > {
                 hilog.error(DOMAIN_NUMBER, TAG, `Failed to start SpecifiedAbility. Code is ${err.code}, message is ${err.message}`);
               })
               this.KEY_NEW = this.KEY_NEW + 'a';
             })
             // ...
           }
           .width('100%')
         }
         .height('100%')
       }
     }
    
  3. 由于SpecifiedAbility的啟動(dòng)模式被配置為指定實(shí)例啟動(dòng)模式,因此在SpecifiedAbility啟動(dòng)之前,會(huì)先進(jìn)入對(duì)應(yīng)的AbilityStage的[onAcceptWant()]生命周期回調(diào)中,以獲取該UIAbility實(shí)例的Key值。然后系統(tǒng)會(huì)自動(dòng)匹配,如果存在與該UIAbility實(shí)例匹配的Key,則會(huì)啟動(dòng)與之綁定的UIAbility實(shí)例,并進(jìn)入該UIAbility實(shí)例的[onNewWant()]回調(diào)函數(shù);否則會(huì)創(chuàng)建一個(gè)新的UIAbility實(shí)例,并進(jìn)入該UIAbility實(shí)例的[onCreate()]回調(diào)函數(shù)和[onWindowStageCreate()]回調(diào)函數(shù)。
    示例代碼中,通過實(shí)現(xiàn)[onAcceptWant()]生命周期回調(diào)函數(shù),解析傳入的want參數(shù),獲取自定義參數(shù)instanceKey。業(yè)務(wù)邏輯會(huì)根據(jù)這個(gè)參數(shù)返回一個(gè)字符串Key,用于標(biāo)識(shí)當(dāng)前UIAbility實(shí)例。如果返回的Key已經(jīng)對(duì)應(yīng)一個(gè)已啟動(dòng)的UIAbility實(shí)例,系統(tǒng)會(huì)將該UIAbility實(shí)例拉回前臺(tái)并獲焦,而不會(huì)創(chuàng)建新的實(shí)例。如果返回的Key沒有對(duì)應(yīng)已啟動(dòng)的UIAbility實(shí)例,則系統(tǒng)會(huì)創(chuàng)建新的UIAbility實(shí)例并啟動(dòng)。
    import AbilityStage from '@ohos.app.ability.AbilityStage';
    import type Want from '@ohos.app.ability.Want';
    
    export default class MyAbilityStage extends AbilityStage {
      onAcceptWant(want: Want): string {
        // 在被調(diào)用方的AbilityStage中,針對(duì)啟動(dòng)模式為specified的UIAbility返回一個(gè)UIAbility實(shí)例對(duì)應(yīng)的一個(gè)Key值
        // 當(dāng)前示例指的是module1 Module的SpecifiedAbility
        if (want.abilityName === 'SpecifiedFirstAbility' || want.abilityName === 'SpecifiedSecondAbility') {
          // 返回的字符串Key標(biāo)識(shí)為自定義拼接的字符串內(nèi)容
          if (want.parameters) {
            return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`;
          }
        }
         // ...
        return 'MyAbilityStage';
      }
    }
    

鴻蒙文檔.png

說明:
HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

  1. 當(dāng)應(yīng)用的UIAbility實(shí)例已經(jīng)被創(chuàng)建,并且配置為指定實(shí)例模式時(shí),如果再次調(diào)用[startAbility()]方法啟動(dòng)該UIAbility實(shí)例,且[AbilityStage]的[onAcceptWant()]回調(diào)匹配到一個(gè)已創(chuàng)建的UIAbility實(shí)例,則系統(tǒng)會(huì)啟動(dòng)原來的UIAbility實(shí)例,并且不會(huì)重新創(chuàng)建一個(gè)新的UIAbility實(shí)例。此時(shí),該UIAbility實(shí)例的[onNewWant()]回調(diào)會(huì)被觸發(fā),而不會(huì)觸發(fā)[onCreate()]和[onWindowStageCreate()]生命周期回調(diào)。
  2. DevEco Studio默認(rèn)工程中未自動(dòng)生成AbilityStage,AbilityStage文件的創(chuàng)建請(qǐng)參見[AbilityStage組件容器]。
例如在文檔應(yīng)用中,可以為不同的文檔實(shí)例內(nèi)容綁定不同的Key值。每次新建文檔時(shí),可以傳入一個(gè)新的Key值(例如可以將文件的路徑作為一個(gè)Key標(biāo)識(shí)),此時(shí)AbilityStage中啟動(dòng)UIAbility時(shí)都會(huì)創(chuàng)建一個(gè)新的UIAbility實(shí)例;當(dāng)新建的文檔保存之后,回到桌面,或者新打開一個(gè)已保存的文檔,回到桌面,此時(shí)再次打開該已保存的文檔,此時(shí)AbilityStage中再次啟動(dòng)該UIAbility時(shí),打開的仍然是之前原來已保存的文檔界面。

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

1.  打開`文件A`,對(duì)應(yīng)啟動(dòng)一個(gè)新的UIAbility實(shí)例,例如啟動(dòng)`UIAbility實(shí)例1`。
1.  在最近任務(wù)列表中關(guān)閉`文件A`的任務(wù)進(jìn)程,此時(shí)`UIAbility實(shí)例1`被銷毀,回到桌面,再次打開`文件A`,此時(shí)對(duì)應(yīng)啟動(dòng)一個(gè)新的UIAbility實(shí)例,例如啟動(dòng)`UIAbility實(shí)例2`。
1.  回到桌面,打開`文件B`,此時(shí)對(duì)應(yīng)啟動(dòng)一個(gè)新的UIAbility實(shí)例,例如啟動(dòng)`UIAbility實(shí)例3`1.  回到桌面,再次打開`文件A`,此時(shí)仍然啟動(dòng)之前的`UIAbility實(shí)例2`,因?yàn)橄到y(tǒng)會(huì)自動(dòng)匹配UIAbility實(shí)例的Key值,如果存在與之匹配的Key,則會(huì)啟動(dòng)與之綁定的UIAbility實(shí)例。在此例中,之前啟動(dòng)的`UIAbility實(shí)例2``文件A`綁定的Key是相同的,因此系統(tǒng)會(huì)拉回`UIAbility實(shí)例2`并讓其獲焦,而不會(huì)創(chuàng)建新的實(shí)例。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    398

    瀏覽量

    17404
  • 組件
    +關(guān)注

    關(guān)注

    1

    文章

    503

    瀏覽量

    17786
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2302

    瀏覽量

    42689
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙Ability Kit程序框架服務(wù))【UIAbility組件生命周期】

    當(dāng)用戶打開、切換和返回到對(duì)應(yīng)應(yīng)用時(shí),應(yīng)用中的UIAbility實(shí)例會(huì)在其生命周期的不同狀態(tài)之間轉(zhuǎn)換。UIAbility類提供了一系列回調(diào),通過這些回調(diào)可以知道當(dāng)前UIAbility實(shí)例的某個(gè)狀態(tài)發(fā)生改變,會(huì)經(jīng)過
    的頭像 發(fā)表于 05-30 21:51 ?1380次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>生命周期】

    鴻蒙Ability Kit程序框架服務(wù))【UIExtensionAbility】

    [UIExtensionAbility]是UI類型的ExtensionAbility組件,需要與[UIExtensionComponent]一起配合使用,開發(fā)者可以在UIAbility的頁(yè)面中通過
    的頭像 發(fā)表于 06-05 09:19 ?1256次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【UIExtensionAbility】

    鴻蒙開發(fā)-應(yīng)用程序框架UIAbility的使用

    UIAbility銷毀?;蛘哂脩羰褂米罱蝿?wù)列表關(guān)閉該UIAbility實(shí)例時(shí),也會(huì)完成UIAbility的銷毀。 UIAbility啟動(dòng)
    發(fā)表于 01-17 16:36

    鴻蒙應(yīng)用模型:【Ability Kit】簡(jiǎn)介

    Ability Kit程序框架服務(wù))提供了應(yīng)用程序開發(fā)和運(yùn)行的應(yīng)用模型,是系統(tǒng)為開發(fā)者提供的應(yīng)
    的頭像 發(fā)表于 05-29 14:41 ?557次閱讀
    <b class='flag-5'>鴻蒙</b>應(yīng)用模型:【<b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>】簡(jiǎn)介

    鴻蒙Ability Kit程序框架服務(wù))【UIAbility組件概述】

    UIAbility組件是一種包含UI的應(yīng)用組件,主要用于和用戶交互。
    的頭像 發(fā)表于 05-30 20:17 ?384次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>概述】

    鴻蒙Ability Kit程序框架服務(wù))【UIAbility組件生命周期】實(shí)例

    本文檔主要描述了應(yīng)用運(yùn)行過程中UIAbility和自定義組件的生命周期。對(duì)于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期。對(duì)于頁(yè)面
    的頭像 發(fā)表于 05-31 15:03 ?1003次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>生命周期】實(shí)例

    鴻蒙Ability Kit程序框架服務(wù))【UIAbility組件基本用法】

    UIAbility組件的基本用法包括:指定UIAbility啟動(dòng)頁(yè)面以及獲取UIAbility的上下文[UIAbilityContext]
    的頭像 發(fā)表于 06-06 11:02 ?403次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>基本用法】

    鴻蒙Ability Kit程序框架服務(wù))【UIAbility組件與UI的數(shù)據(jù)同步】

    基于當(dāng)前的應(yīng)用模型,可以通過以下幾種方式來實(shí)現(xiàn)UIAbility組件與UI之間的數(shù)據(jù)同步。
    的頭像 發(fā)表于 06-03 10:26 ?411次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>與UI的數(shù)據(jù)同步】

    鴻蒙Ability Kit程序框架服務(wù))【UIAbility組件間交互(設(shè)備內(nèi))】

    UIAbility是系統(tǒng)調(diào)度的最小單元。在設(shè)備內(nèi)的功能模塊之間跳轉(zhuǎn)時(shí),會(huì)涉及到啟動(dòng)特定的UIAbility,該UIAbility可以是應(yīng)用內(nèi)的其他U
    的頭像 發(fā)表于 06-03 09:53 ?602次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>間交互(設(shè)備內(nèi))】

    鴻蒙Ability Kit程序框架服務(wù))【UIAbility內(nèi)和UIAbility間頁(yè)面的跳轉(zhuǎn)】

    基于Stage模型下的UIAbility開發(fā),實(shí)現(xiàn)UIAbility內(nèi)和UIAbility間頁(yè)面的跳轉(zhuǎn)。
    的頭像 發(fā)表于 06-03 14:13 ?617次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>UIAbility</b>內(nèi)和<b class='flag-5'>UIAbility</b>間頁(yè)面的跳轉(zhuǎn)】

    鴻蒙Ability Kit程序框架服務(wù))【ExtensionAbility組件

    ExtensionAbility組件是基于特定場(chǎng)景(例如服務(wù)卡片、輸入法等)提供的應(yīng)用組件,以便滿足更多的使用場(chǎng)景。
    的頭像 發(fā)表于 06-04 15:54 ?461次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【ExtensionAbility<b class='flag-5'>組件</b>】

    鴻蒙Ability Kit程序框架服務(wù))【組件啟動(dòng)規(guī)則(Stage模型)】

    組件啟動(dòng)規(guī)則(Stage模型) 啟動(dòng)組件是指一切啟動(dòng)或連接應(yīng)用組件的行為:
    的頭像 發(fā)表于 06-10 18:47 ?774次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>)【<b class='flag-5'>組件</b><b class='flag-5'>啟動(dòng)</b>規(guī)則(Stage模型)】

    鴻蒙Ability Kit程序框架服務(wù))【應(yīng)用啟動(dòng)框架AppStartup】

    `AppStartup`提供了一種更加簡(jiǎn)單高效的初始化組件的方式,支持異步初始化組件加速應(yīng)用的啟動(dòng)時(shí)間。使用啟動(dòng)框架應(yīng)用開發(fā)者只需要分別為待
    的頭像 發(fā)表于 06-10 18:38 ?652次閱讀

    鴻蒙開發(fā)Ability Kit程序框架服務(wù):任務(wù)管理

    AbilityRecord:系統(tǒng)服務(wù)側(cè)管理一個(gè)UIAbility實(shí)例的最小單元,對(duì)應(yīng)一個(gè)應(yīng)用側(cè)的UIAbility組件實(shí)例。系統(tǒng)服務(wù)側(cè)管理
    的頭像 發(fā)表于 06-24 14:46 ?377次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)<b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b><b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>:任務(wù)管理

    鴻蒙開發(fā)Ability Kit程序框架服務(wù):FA模型啟動(dòng)Stage模型UIAbility

    本文介紹FA模型的三種應(yīng)用組件如何啟動(dòng)Stage模型的UIAbility組件。
    的頭像 發(fā)表于 06-25 16:00 ?314次閱讀
    <b class='flag-5'>鴻蒙</b>開發(fā)<b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b><b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務(wù)</b>:FA模型<b class='flag-5'>啟動(dòng)</b>Stage模型<b class='flag-5'>UIAbility</b>