鸿蒙开发(七)-启动模式

根据代码中定义,UIAbility的启动模式有以下几种:

"launchType": {
  "description": "Indicates the boot mode of ability.",
  "type": "string",
  "enum": [
    "standard",
    "singleton",
    "specified",
    "multiton"
  ],
  "default": "singleton"
},

可以看到enum中有四种启动模式:standard,singleton,specified,multiton。

而系统默认的启动模式是singleton

1:standard

standard多实例模式,每次都会新建实例,在最近任务列表中多出一个。

2:singleton

singleton为单实例模式,是默认的启动模式。

如果应用进程中存在该UIAbility实例,则复用系统中的实例,最近列表中只会存在一个该类型的的实例。

3:specified

specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。

在UIAbility实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的UIAbility实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility()请求。运行时由UIAbility内部业务决定是否创建多实例,如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。

4:multiton

multiton也算是多实例,每次都会新建实例,但是最近任务列表中只会有一个。

5:新建Ability以及Page

首先新建ability:

鸿蒙开发(七)-UIAbility启动模式-LMLPHP

接着需要输入ability名称(这个是唯一的)。

鸿蒙开发(七)-UIAbility启动模式-LMLPHP

填写完成,finish后,默认并不是在当前目录新建了个文件,而是在ets目录下新建了个同名的目录,然后才是Ability文件。

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

export default class EntryAbility4 extends UIAbility {
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

最后还有一点要注意,这里默认的loadContent都是pages/Index.

所以我们还要创建对应的page:

鸿蒙开发(七)-UIAbility启动模式-LMLPHP
鸿蒙开发(七)-UIAbility启动模式-LMLPHP

下面是每次创建后的模版代码:

@Entry
@Component
struct Page3 {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}

另外page的注册信息,还需要在main_pages.json中注册。

当然,如果我们点击新建,studio会自动绑定该信息,如果我们是手动复制代码,拷贝的文件,就需要在json文件中page信息添加了。

6: 添加button,跳转ability

首先,在page文件中获取context:

// 获取UIAbilityContext
let context = getContext(this) as common.UIAbilityContext;

创建want:

let want={
              deviceId:"",
              bundleName:"com.zh.test",
              abilityName:"EntryAbility2"
            }

添加button,完整的代码如下:

import common from '@ohos.app.ability.common'
@Entry
@Component
struct Page2 {
  @State message: string = 'jump2'

  build() {
    Row() {
      Column() {
        Button(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            // 获取UIAbilityContext
            let context = getContext(this) as common.UIAbilityContext;
            let want={
              deviceId:"",
              bundleName:"com.zh.test",
              abilityName:"EntryAbility2"
            }
            context.startAbility(want)
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

7:修改launchType

在module.json5中修改launchType,验证启动模式。

 {
        "name": "EntryAbility4",
        "srcEntry": "./ets/entryability4/EntryAbility4.ts",
        "description": "$string:EntryAbility4_desc",
        "icon": "$media:icon",
        "launchType": "multiton",
        "label": "$string:EntryAbility4_label",
        "startWindowIcon": "$media:icon",
        "startWindowBackground": "$color:start_window_background"
      }
03-31 10:11