精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

UIAbility組件啟動模式

UIAbility的啟動模式是指UIAbility實例在啟動時的不同呈現狀態。針對不同的業務場景,系統提供了三種啟動模式:

singleton啟動模式

singleton啟動模式為單實例模式,也是默認情況下的啟動模式。

每次調用[startAbility()]方法時,如果應用進程中該類型的UIAbility實例已經存在,則復用系統中的UIAbility實例。系統中只存在唯一一個該UIAbility實例,即在最近任務列表中只存在一個該類型的UIAbility實例。

圖1 單實例模式演示效果
uiability-launch-type1

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

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

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

multiton啟動模式

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

圖2 多實例模式演示效果
uiability-launch-type2

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

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

specified啟動模式

specified啟動模式為指定實例模式,針對一些特殊場景使用(例如文檔應用中每次新建文檔希望都能新建一個文檔實例,重復打開一個已保存的文檔希望打開的都是同一個文檔實例)。

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

例如有兩個UIAbility:EntryAbility和SpecifiedAbility,SpecifiedAbility配置為指定實例模式啟動,需要從EntryAbility的頁面中啟動SpecifiedAbility。

  1. 在SpecifiedAbility中,將[module.json5配置文件]的launchType字段配置為specified
    {
      "module": {
        ...
        "abilities": [
          {
            "launchType": "specified",
            ...
          }
        ]
      }
    }
    
  2. 在創建UIAbility實例之前,開發者可以為該實例指定一個唯一的字符串Key,這樣在調用[startAbility()]方法時,應用就可以根據指定的Key來識別響應請求的UIAbility實例。在EntryAbility中,調用[startAbility()]方法時,可以在want參數中增加一個自定義參數,例如instanceKey,以此來區分不同的UIAbility實例。
    // 在啟動指定實例模式的UIAbility時,給每一個UIAbility實例配置一個獨立的Key標識
     // 例如在文檔使用場景中,可以用文檔路徑作為Key標識
     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為調用方UIAbility的UIAbilityContext;
               let want: Want = {
                 deviceId: '', // deviceId為空表示本設備
                 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為調用方UIAbility的UIAbilityContext;
               let want: Want = {
                 deviceId: '', // deviceId為空表示本設備
                 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的啟動模式被配置為指定實例啟動模式,因此在SpecifiedAbility啟動之前,會先進入對應的AbilityStage的[onAcceptWant()]生命周期回調中,以獲取該UIAbility實例的Key值。然后系統會自動匹配,如果存在與該UIAbility實例匹配的Key,則會啟動與之綁定的UIAbility實例,并進入該UIAbility實例的[onNewWant()]回調函數;否則會創建一個新的UIAbility實例,并進入該UIAbility實例的[onCreate()]回調函數和[onWindowStageCreate()]回調函數。
    示例代碼中,通過實現[onAcceptWant()]生命周期回調函數,解析傳入的want參數,獲取自定義參數instanceKey。業務邏輯會根據這個參數返回一個字符串Key,用于標識當前UIAbility實例。如果返回的Key已經對應一個已啟動的UIAbility實例,系統會將該UIAbility實例拉回前臺并獲焦,而不會創建新的實例。如果返回的Key沒有對應已啟動的UIAbility實例,則系統會創建新的UIAbility實例并啟動。
    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 {
        // 在被調用方的AbilityStage中,針對啟動模式為specified的UIAbility返回一個UIAbility實例對應的一個Key值
        // 當前示例指的是module1 Module的SpecifiedAbility
        if (want.abilityName === 'SpecifiedFirstAbility' || want.abilityName === 'SpecifiedSecondAbility') {
          // 返回的字符串Key標識為自定義拼接的字符串內容
          if (want.parameters) {
            return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`;
          }
        }
         // ...
        return 'MyAbilityStage';
      }
    }
    

鴻蒙文檔.png

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

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

以如下步驟所示進行舉例說明。

1.  打開`文件A`,對應啟動一個新的UIAbility實例,例如啟動`UIAbility實例1`1.  在最近任務列表中關閉`文件A`的任務進程,此時`UIAbility實例1`被銷毀,回到桌面,再次打開`文件A`,此時對應啟動一個新的UIAbility實例,例如啟動`UIAbility實例2`1.  回到桌面,打開`文件B`,此時對應啟動一個新的UIAbility實例,例如啟動`UIAbility實例3`1.  回到桌面,再次打開`文件A`,此時仍然啟動之前的`UIAbility實例2`,因為系統會自動匹配UIAbility實例的Key值,如果存在與之匹配的Key,則會啟動與之綁定的UIAbility實例。在此例中,之前啟動的`UIAbility實例2``文件A`綁定的Key是相同的,因此系統會拉回`UIAbility實例2`并讓其獲焦,而不會創建新的實例。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    399

    瀏覽量

    17435
  • 組件
    +關注

    關注

    1

    文章

    505

    瀏覽量

    17805
  • 鴻蒙
    +關注

    關注

    57

    文章

    2313

    瀏覽量

    42747
收藏 人收藏

    評論

    相關推薦

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

    當用戶打開、切換和返回到對應應用時,應用中的UIAbility實例會在其生命周期的不同狀態之間轉換。UIAbility類提供了一系列回調,通過這些回調可以知道當前UIAbility實例的某個狀態發生改變,會經過
    的頭像 發表于 05-30 21:51 ?1425次閱讀
    <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'>服務</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>生命周期】

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

    [UIExtensionAbility]是UI類型的ExtensionAbility組件,需要與[UIExtensionComponent]一起配合使用,開發者可以在UIAbility的頁面中通過
    的頭像 發表于 06-05 09:19 ?1323次閱讀
    <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'>服務</b>)【UIExtensionAbility】

    鴻蒙開發-應用程序框架UIAbility的使用

    UIAbility銷毀。或者用戶使用最近任務列表關閉該UIAbility實例時,也會完成UIAbility的銷毀。 UIAbility啟動
    發表于 01-17 16:36

    鴻蒙應用模型:【Ability Kit】簡介

    Ability Kit程序框架服務)提供了應用程序開發和運行的應用模型,是系統為開發者提供的應
    的頭像 發表于 05-29 14:41 ?590次閱讀
    <b class='flag-5'>鴻蒙</b>應用模型:【<b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>】簡介

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

    UIAbility組件是一種包含UI的應用組件,主要用于和用戶交互。
    的頭像 發表于 05-30 20:17 ?404次閱讀
    <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'>服務</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>概述】

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

    本文檔主要描述了應用運行過程中UIAbility和自定義組件的生命周期。對于UIAbility,描述了Create、Foreground、Background、Destroy四種生命周期。對于頁面
    的頭像 發表于 05-31 15:03 ?1058次閱讀
    <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'>服務</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>生命周期】實例

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

    UIAbility組件的基本用法包括:指定UIAbility啟動頁面以及獲取UIAbility的上下文[UIAbilityContext]
    的頭像 發表于 06-06 11:02 ?427次閱讀
    <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'>服務</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>基本用法】

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

    基于當前的應用模型,可以通過以下幾種方式來實現UIAbility組件與UI之間的數據同步。
    的頭像 發表于 06-03 10:26 ?436次閱讀
    <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'>服務</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>與UI的數據同步】

    鴻蒙Ability Kit程序框架服務)【UIAbility組件間交互(設備內)】

    UIAbility是系統調度的最小單元。在設備內的功能模塊之間跳轉時,會涉及到啟動特定的UIAbility,該UIAbility可以是應用內的其他U
    的頭像 發表于 06-03 09:53 ?618次閱讀
    <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'>服務</b>)【<b class='flag-5'>UIAbility</b><b class='flag-5'>組件</b>間交互(設備內)】

    鴻蒙Ability Kit程序框架服務)【UIAbility內和UIAbility間頁面的跳轉】

    基于Stage模型下的UIAbility開發,實現UIAbility內和UIAbility間頁面的跳轉。
    的頭像 發表于 06-03 14:13 ?661次閱讀
    <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'>服務</b>)【<b class='flag-5'>UIAbility</b>內和<b class='flag-5'>UIAbility</b>間頁面的跳轉】

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

    ExtensionAbility組件是基于特定場景(例如服務卡片、輸入法等)提供的應用組件,以便滿足更多的使用場景。
    的頭像 發表于 06-04 15:54 ?489次閱讀
    <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'>服務</b>)【ExtensionAbility<b class='flag-5'>組件</b>】

    鴻蒙Ability Kit程序框架服務)【組件啟動規則(Stage模型)】

    組件啟動規則(Stage模型) 啟動組件是指一切啟動或連接應用組件的行為:
    的頭像 發表于 06-10 18:47 ?831次閱讀
    <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'>服務</b>)【<b class='flag-5'>組件</b><b class='flag-5'>啟動</b>規則(Stage模型)】

    鴻蒙Ability Kit程序框架服務)【應用啟動框架AppStartup】

    `AppStartup`提供了一種更加簡單高效的初始化組件的方式,支持異步初始化組件加速應用的啟動時間。使用啟動框架應用開發者只需要分別為待
    的頭像 發表于 06-10 18:38 ?667次閱讀

    鴻蒙開發Ability Kit程序框架服務:任務管理

    AbilityRecord:系統服務側管理一個UIAbility實例的最小單元,對應一個應用側的UIAbility組件實例。系統服務側管理
    的頭像 發表于 06-24 14:46 ?404次閱讀
    <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'>服務</b>:任務管理

    鴻蒙開發Ability Kit程序框架服務:FA模型啟動Stage模型UIAbility

    本文介紹FA模型的三種應用組件如何啟動Stage模型的UIAbility組件
    的頭像 發表于 06-25 16:00 ?330次閱讀
    <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'>服務</b>:FA模型<b class='flag-5'>啟動</b>Stage模型<b class='flag-5'>UIAbility</b>