UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。一般是一个UIAbility
任务视图中看到一个任务,则建议使用一个UIAbility,多个页面的方式
- 任务视图中看到多个任务,或者需要同时开启多个窗口,则建议使用多个UIAbility开发不同的模块功能
需要在module.json5配置文件的abilities标签中声明UIAbility的名称、入口、标签等相关信息。
kotlin
"abilities": [
{
"name": "EntryAbility", // UIAbility组件的名称
"srcEntry": "./ets/entryability/EntryAbility.ets", // UIAbility组件的代码路径
"description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
"icon": "$media:icon", // UIAbility组件的图标
"label": "$string:EntryAbility_label", // UIAbility组件的标签
"startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
"startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
"exported": true,// 是否可以导出,一般 需要外部打开的 就需要时true
"launchType": "singleton",// 启动模式
}
]
Ability是UIAbility基类
- onConfigurationUpdate 当系统配置更新时调用
- onMemoryLevel 当内存到达不同级别时系统回调该方法。
UIAbility生命周期状态
- onCreate 应用创建,UIAbility实例创建完成时触发
- onWindowStageCreate 主Window创建完成 windowStage.loadContent 加载第一个组件
- onForeground 在前台
- onBackground 应用退到后台
- onWindowStageWillDestroy 即将被销毁
- onWindowStageDestroy window销毁,释放UI资源,例如在onWindowStageDestroy()中注销获焦/失焦等WindowStage事件
- onDestroy 应用销毁
- onWindowStageRestore Window重新创建的时候
- onNewWant 重新启动,不会走onCreate和onWindowStageCreate ,
如果已经打开,再打开,就会走这里,比如按home键,之后桌面打开,或者其他应用打开这个
启动模式
- singleton(单实例模式)当调用startAbility() , 由于启动的还是原来的UIAbility实例,并未重新创建一个新的UIAbility实例,此时只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。
- multiton(多实例模式)multiton启动模式为多实例模式,每次创建都是新的
- specified(指定实例模式)针对一些特殊场景使用,一般也用不到
上下文 UIAbilityContext
可以拿到如包代码路径、Bundle名称、Ability名称和应用程序需要的环境状态等属性信息,以及可以获取操作UIAbility实例的方法(如startAbility()、connectServiceExtensionAbility()、terminateSelf()等)。
- 在UIAbility中,使用 this.context
- 在Component中使用 let context = getContext(this) as common.UIAbilityContext;
启动自己应用内或者第三方的UIAbility
UIAbilityContext.startAbility() 或者 UIAbilityContext.startAbilityForResult()
Want
- deviceId:deviceId为空表示本设备
- bundleName:在AppScope中app.json5中定义的
- moduleName:// moduleName非必选
- abilityName // 要打开的name module.json5中定义的
- parameters // 传递的参数 parameters?: Record<string, Object>,直接.就可以拿 data.want?.parameters?.result
terminateSelf 和 terminateSelfWithResult
关闭当前的UIAbility,context.startAbilityForResult(want) 关闭方法停止当前UIAbility实例时,默认会保留该实例的快照,最近任务中还能发现,如果需要完全消失,在其对应UIAbility的module.json5配置文件中,将abilities标签的removeMissionAfterTerminate字段配置为true
ts
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication',
moduleName: 'entry', // moduleName非必选
abilityName: 'EntryAbilityTwo',
parameters: {
// 自定义信息
info: '11111',
name: '第一个'
},
};
let context = getContext(this) as common.UIAbilityContext;
// context为调用方UIAbility的UIAbilityContext
context.startAbility(wantInfo).then(() => {
console.info('startAbility success.');
}).catch((error: BusinessError) => {
console.error('startAbility failed.');
});
context.startAbilityForResult(wantInfo).then((data) => {
console.log(`----${data.resultCode} ---- ${data.want?.parameters?.result}`)
}).catch(() => {
})
启动第三方的
- 指定应用链接(推荐):通过openLink或startAbility接口来指定应用链接,拉起目标应用页面。
- 指定Ability(不推荐):通过startAbility接口指定具体的Ability,显式拉起目标应用页面
从API 12开始,已不再支持三方应用使用该方式拉起其他应用
比如启动应用设置页面
ts
let wantInfo: Want = {
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry',
parameters: {
pushParams: 'com.example.myapplication' // 打开指定应用的详情页面
}
}
context.startAbility(wantInfo)
判断是否可以打开某个应用,也就是某个应用是否安装
在entry模块的module.json5文件中的querySchemes字段中,最多允许配置50个URL scheme,使用canOpenLink是bundleManager提供的支持判断目标应用是否可访问的接口
推荐使用隐士调整
在 UIAbility 的module.json5中加入,推荐使用 openLink 和 startAbility 使用 uri 下面是调用的地方
ts
try {
// 必须有:// ,否则就走到catch里面了, The specified link is invalid
let link: string = 'zhiyang://hostZhiYang'
let isExist = bundleManager.canOpenLink(link);
this.isExist = isExist;
promptAction.showToast({ message: `是否存在${isExist}` })
if (isExist) {
this.context.openLink(link, { parameters: { parame1: '来自外部', parame2: 100 } }, (error) => {
console.log(`json = > ${error}`)
})
// startAbility 方式
this.context.startAbility({ uri: 'zhiyang://hostZhiYang', parameters: { parame1: '来自外部', parame2: 100 } })
}
} catch (e) {
console.error(`错误了 ${e}`)
promptAction.showToast({ message: `错误了${e}` })
}
接受的UIAbility,在onCreate
和onNewWant
中都要去接受,如果应用已经打开,在打开就会走onNewWant
了
ts
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
this.from = want.parameters?.parame1 as string
this. code = want.parameters?.parame2 as number
}
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let from = want.parameters?.parame1
let code = want.parameters?.parame2
promptAction.showToast({message:`${from} - ${code} 新的 onNewWant `})
console.log(`from onNewWant ${from} - ${code}`)
}
ts
"uris": [
{
"scheme": "zhiyang",
"host": "hostZhiYang",
},