络腮胡菲菲 发表于 2024-11-7 03:58:40

【HarmonyOS】鸿蒙开辟之Stage模子-UIAbility的启动模式——第4.4章

UIAbility的启动模式简介

一共有四种:singleton,standard,specified,multion。在项目目次的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图
https://i-blog.csdnimg.cn/blog_migrate/31b7c3a1832ac0b87a6b257ad9537dd4.png
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
https://i-blog.csdnimg.cn/blog_migrate/3180b6c02508801907b15e574b5a8e8f.png
ets多出testAbility文件夹和文件(后续需用用到testAbility文件进行修改)
https://i-blog.csdnimg.cn/blog_migrate/456ac5162d05556b6b3f8d8e444e0708.png
1.2 创建为后,module.json5文件的module->abilities会多出一个testAbility对象。并修改module.json5配置文件
https://i-blog.csdnimg.cn/blog_migrate/32fe3a628c621e20855ff6d83b3b41a0.png
{
   "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.name
      moduleName: 'entry', // 模块名 去项目module.json5文件里的module.name
      parameters: { //参数
      instanceKey: "id_"+id,//UIAbility实例的key
      },
    }
    //1.3 尝试拉起目标UIAbility实例
    this.context.startAbility(want);
}

@State num:number[]=
@State curNum:number=1
build(){
    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%")
    }

}
}
运行效果:
https://i-blog.csdnimg.cn/blog_migrate/8aab51cb4bfab75eda44142abbff4e21.png
文档页面页面代码如下:
//文档页面
@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.name
      moduleName: '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值
https://i-blog.csdnimg.cn/blog_migrate/03b1f0e32771cb3d137eca2a1e93bbea.png
代码实例
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名称是否为testAbility
    if (want.abilityName === 'testAbility') {
      // 返回的字符串Key标识为自定义拼接的字符串内容
      return `AbilityInstanceKey_${want.parameters.instanceKey}`;
    }

    return '';
}
}
还需要在module.json5配置文件编辑srcEntry文件路劲(填写你自己的abilityStage.ets文件路径),才气获取key值。
https://i-blog.csdnimg.cn/blog_migrate/08a7c1d207f669bde6c0b314b3e0bbb6.png
4. 第四步:修改testability.ts的加载路径为文档页面
https://i-blog.csdnimg.cn/blog_migrate/c3030368ee095a35814ff802e50a6f3b.png
末了重启,点击文档,就能创建差别key的UIAbility实例
   ✨                                                   踩坑不易,还希望各位大佬支持一下                                          \textcolor{gray}{踩坑不易,还希望各位大佬支持一下}                     踩坑不易,还希望各位大佬支持一下

页: [1]
查看完整版本: 【HarmonyOS】鸿蒙开辟之Stage模子-UIAbility的启动模式——第4.4章