UIAbi lity的啟動模式簡介
一共有四種:singleton,standard,specified,multion。在項目目錄的:src/main/module.json5。默認開啟模式為singleton(單例模式)。如下圖
singleton(單實例模式)啟動模式
每個UIAbility只存在唯一實例。任務列表中只會存在一個相同的UIAbility (會覆蓋上一個實例)
代碼實例:
{"module": {..."abilities": [{"launchType": "singleton",...}]}
}
standard(標準實例模式)啟動模式
每次啟動UIAbility都會創建一個新的實例。在任務列表中可能存在一個或多個相同的UIAbility實例。新實例創建后,舊實例依然存在。
好處:實現多開效果
代碼實例:
{"module": {..."abilities": [{"launchType": "standard",...}]}
}
multion (多實例模式) 啟動模式
每次啟動UIAbility都會創建一個新的實例。新實例創建后,舊實例會被移除。
場景: 用戶在使用分屏功能時,希望使用兩個不同應用(例如備忘錄應用和圖庫應用)之間進行分屏,也希望能使用同一個應用(例如備忘錄應用自身)進行分屏。
代碼實例:
{"module": {..."abilities": [{"launchType": "multion",...}]}
}
specified(指定實例模式)啟動模式
每個UIAbility實例可以設置Key指示。啟動UIAbility時,需要制定key,存在key相同實例直接被拉起,不存在則創建新實例
場景: 用戶打開文檔應用,從文檔應用中打開一個文檔內容,回到文檔應用,繼續打開同一個文檔,希望打開的還是同一個文檔內容;以及在文檔應用中新建一個新的文檔,每次新建文檔,希望打開的都是一個新的空白文檔內容。
-
第一步:創建新的ability,修改module.json5配置文件
1.1 在ets文件加載創建新的ability,名字為testAbility
ets多出testAbility文件夾和文件(后續需用用到testAbility文件進行修改)
1.2 創建為后,module.json5文件的module->abilities會多出一個testAbility對象。并修改module.json5配置文件
{"module": {..."abilities": [...,{"name": "testAbility","srcEntry": "./ets/testability/testAbility.ts","description": "$string:testAbility_desc","icon": "$media:icon","label": "$string:testAbility_label","startWindowIcon": "$media:icon","startWindowBackground": "$color:start_window_background","launchType": "specified",}]}
}
- 第二步:specified啟動模式實例代碼
2.1 當前UIAbility調用startAbility方法拉起目標UIAbility
實例代碼:
@Entry
@Component
export struct UiAbilityStartMode{//1.1 獲取上下文private context = getContext(this) as common.UIAbilityContext;handleStartAbilityTest(id:number) {//1.2 指定要跳轉到的UIAbility的信息let want:Want = {deviceId: '', // deviceId為空表示本設備bundleName: 'com.example.myapplication',abilityName: 'testAbility',//ability的名稱 去項目module.json5文件里的module.abilities.namemoduleName: 'entry', // 模塊名 去項目module.json5文件里的module.nameparameters: { //參數instanceKey: "id_"+id,//UIAbility實例的key},}//1.3 嘗試拉起目標UIAbility實例this.context.startAbility(want);}@State num:number[]=[1,2]@State curNum:number=1build(){Column(){TitleBar({titleBarAttribute:{title:"UIAbility啟動模式",backShow:true,backCallback:()=>{router.back()}},}){}Column(){Column(){Text("specified啟動模式").fontSize(26).margin({bottom:10})Button("添加文件").onClick(()=>{let numData = this.curNum++this.num.push(numData)this.handleStartAbilityTest(numData)})Column(){ForEach(this.num,(item,index) => {Row(){Row(){Image($r("app.media.csdn")).width(26).margin({right:10})Text("文檔-"+item).fontColor(Color.White)}Text("查看文檔").fontColor(Color.White)}.borderRadius(10).margin({bottom:10}).padding(10).backgroundColor("#409eff").width("90%").justifyContent(FlexAlign.SpaceBetween).onClick(()=>{this.handleStartAbilityTest(item)})})}.margin({top:20})}}.justifyContent(FlexAlign.Center).height("100%")}}
}
運行結果:
文檔頁面頁面代碼如下:
//文檔頁面
@Entry
@Component
export struct DocPage{//1.1 獲取上下文private context = getContext(this) as common.UIAbilityContext;handleStartAbilityTest() {//1.2 指定要跳轉到的UIAbility的信息let want:Want = {deviceId: '', // deviceId為空表示本設備bundleName: 'com.example.myapplication',abilityName: 'EntryAbility',//ability的名稱 去項目module.json5文件里的module.abilities.namemoduleName: 'entry', // 模塊名 去項目module.json5文件里的module.name}//1.3 嘗試拉起目標UIAbility實例this.context.startAbility(want);}build(){Column(){Text("你成功了")Button("返回").onClick(()=>{this.handleStartAbilityTest()})}.justifyContent(FlexAlign.Center).height("100%")}
}
- 第三步:為目標UIAbility實例生成唯一key
3.1 在AbilityStage的生命周期回調中,為目標UIAbility實例生成唯一key。
在ets下創建abilityStage文件夾和文件,獲取UIAbility實例key值
代碼實例
import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';//獲取UIAbility實例對應的一個Key值
export default class MyAbilityStage extends AbilityStage {onAcceptWant(want:Want): string {// 在被調用方的AbilityStage中,針對啟動模式為specified的UIAbility返回一個UIAbility實例對應的一個Key值// 判斷當前拉取的ability名稱是否為testAbilityif (want.abilityName === 'testAbility') {// 返回的字符串Key標識為自定義拼接的字符串內容return `AbilityInstanceKey_${want.parameters.instanceKey}`;}return '';}
}
還需要在module.json5配置文件編輯srcEntry文件路勁(填寫你自己的abilityStage.ets文件路徑),才能獲取key值。
4. 第四步:修改testability.ts的加載路徑為文檔頁面
最后重啟,點擊文檔,就能創建不同key的UIAbility實例
? 踩坑不易,還希望各位大佬支持一下 \textcolor{gray}{踩坑不易,還希望各位大佬支持一下} 踩坑不易,還希望各位大佬支持一下
📃 個人主頁: \textcolor{green}{個人主頁:} 個人主頁: 沉默小管
📃 個人網站: \textcolor{green}{個人網站:} 個人網站: 沉默小管
📃 個人導航網站: \textcolor{green}{個人導航網站:} 個人導航網站: 沉默小管導航網
📃 我的開源項目: \textcolor{green}{我的開源項目:} 我的開源項目: vueCms.cn
🔥 技術交流 Q Q 群: 837051545 \textcolor{green}{技術交流QQ群:837051545} 技術交流QQ群:837051545
👍 點贊,你的認可是我創作的動力! \textcolor{green}{點贊,你的認可是我創作的動力!} 點贊,你的認可是我創作的動力!
?? 收藏,你的青睞是我努力的方向! \textcolor{green}{收藏,你的青睞是我努力的方向!} 收藏,你的青睞是我努力的方向!
?? 評論,你的意見是我進步的財富! \textcolor{green}{評論,你的意見是我進步的財富!} 評論,你的意見是我進步的財富!
如果有不懂可以留言,我看到了應該會回復
如有錯誤,請多多指教