开天辟地 HarmonyOS(鸿蒙) - 开发基础: UIAbility 的启动类型

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

开天辟地 HarmonyOS(鸿蒙) - 开发基础: UIAbility 的启动类型

示例如下:

pages\basic\LaunchTypeDemo.ets

/*
 * UIAbility 的启动类型 - 共有 3 种(singleton, multiton 或 standard, specified)
 * 需要在 module.json5 配置文件中,通过 abilities 的 launchType 标签指定 UIAbility 的启动类型
 *
 * singleton - 单实例方式,每次打开时如果发现已存在则复用之,即最近任务列表中只会有一个这种类型的实例
 * multiton 或 standard - 多实例方式,每次打开都创建一个新的实例,即最近任务列表中可能会有多个这种类型的实例
 * specified - 指定实例模式,每次打开时,如果发现指定 specified 标识的 UIAbility 已存在则复用之,否则就新建实例
 *   在 HAP 对应的 AbilityStage 中的 onAcceptWant() 中返回 specified 标识
 *   关于 HAP 对应的 AbilityStage 请参见 /entry/src/main/ets/entryability/MyAbilityStage.ets 中的代码
 */

import { TitleBar } from '../TitleBar';
import { common, Want } from '@kit.AbilityKit';

@Entry
@Component
struct UIAbilityDemo {

  build() {
    Column() {
      TitleBar()
      Tabs() {
        TabContent() { MySample1() }.tabBar('基础').align(Alignment.Top)
      }
      .scrollable(true)
      .barMode(BarMode.Scrollable)
      .layoutWeight(1)
    }
  }
}

@Component
struct MySample1 {

  context = getContext(this) as common.UIAbilityContext;
  @State message: string = ""

  aboutToAppear(): void {
    this.message = `${LocalStorage.getShared().get("param")}`
  }

  build() {
    Column({ space: 10 }) {

      Text(this.message)

      Button("以 singleton 的方式启动一个 UIAbility").onClick(async () => {
        // Want - 需要拉起的 ability 的相关信息
        let want: Want = {
          bundleName: 'com.webabcd.harmonydemo', // 需要打开的 ability 的 bundle 的名称
          abilityName: 'com.webabcd.harmonydemo.EntryAbility_singleton', // 需要打开的 ability 的名称(此名称是在 module.json5 中配置的)
        };
        // context.startAbility() - 拉起指定的 ability
        await this.context.startAbility(want)
      })

      Button("以 multiton 的方式启动一个 UIAbility").onClick(async () => {
        // Want - 需要拉起的 ability 的相关信息
        let want: Want = {
          bundleName: 'com.webabcd.harmonydemo', // 需要打开的 ability 的 bundle 的名称
          abilityName: 'com.webabcd.harmonydemo.EntryAbility_multiton', // 需要打开的 ability 的名称(此名称是在 module.json5 中配置的)
        };
        // context.startAbility() - 拉起指定的 ability
        await this.context.startAbility(want)
      })

      Button("以 specified 的方式(标识为 abc)启动一个 UIAbility").onClick(async () => {
        // Want - 需要拉起的 ability 的相关信息
        let want: Want = {
          bundleName: 'com.webabcd.harmonydemo', // 需要打开的 ability 的 bundle 的名称
          abilityName: 'com.webabcd.harmonydemo.EntryAbility_specified', // 需要打开的 ability 的名称(此名称是在 module.json5 中配置的)
          parameters: {
            specifiedKey: "abc" // 传参,用于在 module 对应的 AbilityStage 中的 onAcceptWant() 中确定如何返回 specified 标识
          }
        };
        // context.startAbility() - 拉起指定的 ability
        await this.context.startAbility(want)
      })

      Button("以 specified 的方式(标识为 xyz)启动一个 UIAbility").onClick(async () => {
        // Want - 需要拉起的 ability 的相关信息
        let want: Want = {
          bundleName: 'com.webabcd.harmonydemo', // 需要打开的 ability 的 bundle 的名称
          abilityName: 'com.webabcd.harmonydemo.EntryAbility_specified', // 需要打开的 ability 的名称(此名称是在 module.json5 中配置的)
          parameters: {
            specifiedKey: "xyz" // 传参,用于在 module 对应的 AbilityStage 中的 onAcceptWant() 中确定如何返回 specified 标识
          }
        };
        // context.startAbility() - 拉起指定的 ability
        await this.context.startAbility(want)
      })
    }
  }
}

\entry\src\main\ets\entryability\EntryAbility_singleton.ets

/*
 * UIAbility - 用于为应用提供绘制界面的窗口
 * UIAbility 的相关配置,请参见 module.json5 配置文件中的 abilities 标签
 *
 * 本例用于演示 singleton 方式启动的 UIAbility
 */

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility2 extends UIAbility {

  param = ""
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.param = `abilityName:${want.abilityName ?? ""}`
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    let record: Record<string, string> = { 'param': this.param };
    windowStage.loadContent('pages/basic/LaunchTypeDemo', new LocalStorage(record));
  }
}

\entry\src\main\ets\entryability\EntryAbility_multiton.ets

/*
 * UIAbility - 用于为应用提供绘制界面的窗口
 * UIAbility 的相关配置,请参见 module.json5 配置文件中的 abilities 标签
 *
 * 本例用于演示 multiton 方式启动的 UIAbility
 */

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility2 extends UIAbility {

  param = ""
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.param = `abilityName:${want.abilityName ?? ""}`
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    let record: Record<string, string> = { 'param': this.param };
    windowStage.loadContent('pages/basic/LaunchTypeDemo', new LocalStorage(record));
  }
}

\entry\src\main\ets\entryability\EntryAbility_specified.ets

/*
 * UIAbility - 用于为应用提供绘制界面的窗口
 * UIAbility 的相关配置,请参见 module.json5 配置文件中的 abilities 标签
 *
 * 本例用于演示 specified 方式启动的 UIAbility
 */

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility2 extends UIAbility {

  param = ""
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.param = `abilityName:${want.abilityName ?? ""}, specifiedKey:${want.parameters?.specifiedKey ?? ""}`
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    let record: Record<string, string> = { 'param': this.param };
    windowStage.loadContent('pages/basic/LaunchTypeDemo', new LocalStorage(record));
  }
}

\entry\src\main\ets\entryability\MyAbilityStage.ets

/*
 * AbilityStage - 每个 HAP 都会对应一个 AbilityStage
 * 需要在 module.json5 中的 module 的 srcEntry 中配置对应的 AbilityStage 的代码的地址
 */

import { AbilityStage, Want } from '@kit.AbilityKit';

export default class MyAbilityStage extends AbilityStage {

  // 创建完成时的回调(注:加载 HAP 的入口 UIAbility 实例之前会先创建 AbilityStage 实例)
  onCreate() {

  }

  // 当 UIAbility 以 specified 的方式启动时,就会走到 HAP 的对应的 AbilityStage 中的 onAcceptWant() 回调
  onAcceptWant(want: Want): string {
    // 返回 specified 标识
    //   如果相同 specified 标识的 UIAbility 已存在,则热启动它(启动已存在的实例)
    //   如果相同 specified 标识的 UIAbility 不存在,则冷启动它(创建新的实例,并启动)
    return `${want.parameters?.specifiedKey ?? ""}`
  }
}

源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd

posted @   webabcd  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示