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

打印 上一主题 下一主题

主题 1040|帖子 1040|积分 3120


UIAbility的启动模式简介

一共有四种:singleton,standard,specified,multion。在项目目次的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图

singleton(单实例模式)启动模式

每个UIAbility只存在唯一实例。任务列表中只会存在一个类似的UIAbility (会覆盖上一个实例)
代码实例:
  1. {
  2.    "module": {
  3.      ...
  4.      "abilities": [
  5.        {
  6.          "launchType": "singleton",
  7.          ...
  8.        }
  9.      ]
  10.   }
  11. }
复制代码
standard(尺度实例模式)启动模式

每次启动UIAbility都会创建一个新的实例。在任务列表中可能存在一个或多个类似的UIAbility实例。新实例创建后,旧实例依然存在。
好处:实现多开效果
代码实例:
  1. {
  2.    "module": {
  3.      ...
  4.      "abilities": [
  5.        {
  6.          "launchType": "standard",
  7.          ...
  8.        }
  9.      ]
  10.   }
  11. }
复制代码
multion (多实例模式) 启动模式

每次启动UIAbility都会创建一个新的实例。新实例创建后,旧实例会被移除。
场景: 用户在使用分屏功能时,希望使用两个差别应用(例如备忘录应用和图库应用)之间进行分屏,也希望能使用同一个应用(例如备忘录应用自身)进行分屏。
代码实例:
  1. {
  2.    "module": {
  3.      ...
  4.      "abilities": [
  5.        {
  6.          "launchType": "multion",
  7.          ...
  8.        }
  9.      ]
  10.   }
  11. }
复制代码
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配置文件

  1. {
  2.    "module": {
  3.      ...
  4.      "abilities": [
  5.      ...,
  6.         {
  7.         "name": "testAbility",
  8.         "srcEntry": "./ets/testability/testAbility.ts",
  9.         "description": "$string:testAbility_desc",
  10.         "icon": "$media:icon",
  11.         "label": "$string:testAbility_label",
  12.         "startWindowIcon": "$media:icon",
  13.         "startWindowBackground": "$color:start_window_background",
  14.         "launchType": "specified",
  15.       }
  16.      ]
  17.   }
  18. }
复制代码

  • 第二步:specified启动模式实例代码
    2.1 当前UIAbility调用startAbility方法拉起目标UIAbility
    实例代码:
  1. @Entry
  2. @Component
  3. export struct UiAbilityStartMode{
  4.   //1.1 获取上下文
  5.   private context = getContext(this) as common.UIAbilityContext;
  6.   handleStartAbilityTest(id:number) {
  7.     //1.2 指定要跳转到的UIAbility的信息
  8.     let want:Want = {
  9.       deviceId: '', // deviceId为空表示本设备
  10.       bundleName: 'com.example.myapplication',
  11.       abilityName: 'testAbility',//ability的名称  去项目module.json5文件里的module.abilities.name
  12.       moduleName: 'entry', // 模块名 去项目module.json5文件里的module.name
  13.       parameters: { //参数
  14.         instanceKey: "id_"+id,//UIAbility实例的key
  15.       },
  16.     }
  17.     //1.3 尝试拉起目标UIAbility实例
  18.     this.context.startAbility(want);
  19.   }
  20.   @State num:number[]=[1,2]
  21.   @State curNum:number=1
  22.   build(){
  23.     Column(){
  24.       TitleBar({
  25.         titleBarAttribute:{
  26.           title:"UIAbility启动模式",
  27.           backShow:true,
  28.           backCallback:()=>{
  29.             router.back()
  30.           }
  31.         },
  32.       }){}
  33.       Column(){
  34.         Column(){
  35.           Text("specified启动模式").fontSize(26).margin({bottom:10})
  36.           Button("添加文件").onClick(()=>{
  37.             let numData = this.curNum++
  38.             this.num.push(numData)
  39.             this.handleStartAbilityTest(numData)
  40.           })
  41.           Column(){
  42.             ForEach(this.num,(item,index) => {
  43.               Row(){
  44.                 Row(){
  45.                   Image($r("app.media.csdn")).width(26).margin({right:10})
  46.                   Text("文档-"+item).fontColor(Color.White)
  47.                 }
  48.                 Text("查看文档").fontColor(Color.White)
  49.               }.borderRadius(10).margin({bottom:10}).padding(10)
  50.               .backgroundColor("#409eff").width("90%").justifyContent(FlexAlign.SpaceBetween)
  51.               .onClick(()=>{
  52.                 this.handleStartAbilityTest(item)
  53.               })
  54.             })
  55.           }.margin({top:20})
  56.         }
  57.       }.justifyContent(FlexAlign.Center)
  58.       .height("100%")
  59.     }
  60.   }
  61. }
复制代码
运行效果:

文档页面页面代码如下:
  1. //文档页面
  2. @Entry
  3. @Component
  4. export struct DocPage{
  5.   //1.1 获取上下文
  6.   private context = getContext(this) as common.UIAbilityContext;
  7.   handleStartAbilityTest() {
  8.     //1.2 指定要跳转到的UIAbility的信息
  9.     let want:Want = {
  10.       deviceId: '', // deviceId为空表示本设备
  11.       bundleName: 'com.example.myapplication',
  12.       abilityName: 'EntryAbility',//ability的名称  去项目module.json5文件里的module.abilities.name
  13.       moduleName: 'entry', // 模块名 去项目module.json5文件里的module.name
  14.     }
  15.     //1.3 尝试拉起目标UIAbility实例
  16.     this.context.startAbility(want);
  17.   }
  18.   build(){
  19.     Column(){
  20.       Text("你成功了")
  21.       Button("返回").onClick(()=>{
  22.         this.handleStartAbilityTest()
  23.       })
  24.     }.justifyContent(FlexAlign.Center)
  25.     .height("100%")
  26.   }
  27. }
复制代码

  • 第三步:为目标UIAbility实例生成唯一key
    3.1 在AbilityStage的生命周期回调中,为目标UIAbility实例生成唯一key。
    在ets下创建abilityStage文件夹和文件,获取UIAbility实例key值

    代码实例
  1. import AbilityStage from '@ohos.app.ability.AbilityStage';
  2. import Want from '@ohos.app.ability.Want';
  3. //获取UIAbility实例对应的一个Key值
  4. export default class MyAbilityStage extends AbilityStage {
  5.   onAcceptWant(want:Want): string {
  6.     // 在被调用方的AbilityStage中,针对启动模式为specified的UIAbility返回一个UIAbility实例对应的一个Key值
  7.     // 判断当前拉取的ability名称是否为testAbility
  8.     if (want.abilityName === 'testAbility') {
  9.       // 返回的字符串Key标识为自定义拼接的字符串内容
  10.       return `AbilityInstanceKey_${want.parameters.instanceKey}`;
  11.     }
  12.     return '';
  13.   }
  14. }
复制代码
还需要在module.json5配置文件编辑srcEntry文件路劲(填写你自己的abilityStage.ets文件路径),才气获取key值。

4. 第四步:修改testability.ts的加载路径为文档页面

末了重启,点击文档,就能创建差别key的UIAbility实例
   ✨                                                   踩坑不易,还希望各位大佬支持一下                                            \textcolor{gray}{踩坑不易,还希望各位大佬支持一下}                     踩坑不易,还希望各位大佬支持一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表