开天辟地 HarmonyOS(鸿蒙) - 开发基础: UIAbility 的启动类型
开天辟地 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 ?? ""}`
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步