Ability
Ability是应用所具备能力的抽象,也是应用程序的基本组成部分,主要包括组件生命周期回调、系统环境变化通知、应用跳转、卡片开发等能力。
Ability框架模型两种形态
- FA模型
- Stage模型
Stage模型
Stage模型中的应用组件是由Ability这个基础概念演化而来。
在Stage模型中,有两类Ability:
- UIAbility:负责用户界面和用户交互。
- ExtensionAbility:负责 UIAbility 之外的事情。
Stage模型特点
- 为复杂应用设计
- 程序逻辑与用户界面解耦
- 开放的扩展能力点
自定义Stage
在ets目录下创建MyStage
import AbilityStage from '@ohos.app.ability.AbilityStage';
import Want from '@ohos.app.ability.Want';
export default class MyStage extends AbilityStage{
onAcceptWant(want: Want) {
if(want.abilityName == 'ability1'){
return "Ability1_"+want.parameters.instanceKey
}
return "";
}
}
在module.json5添加srcEntry配置
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"srcEntry": "./ets/MyStage.ts",
....
}
修改ability启动模式为specified
,这样Ability才可以使用到自定义MyStage
{
"name": "Ability1",
"srcEntry": "./ets/ability1/Ability1.ets",
"description": "$string:Ability1_desc",
"icon": "$media:layered_image",
"label": "$string:Ability1_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"launchType": "specified"
}
UIAbility
UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility是系统
调度的基本单元,为应用提供绘制界面的窗口,一个UIAbility可以对应于多个页面,建
议将一个独立的功能模块放到一个UIAbility中,以多页面的形式呈现。
UIAbility的生命周期原理
UIAbility组件启动模式
启动模式 | 描述 | 说明 |
---|---|---|
Singleton | 单实例 | 当用户打开浏览器应用,并浏览访问相关内容后,回到桌面,再次打开该应用,显示的仍然是用户当前访问的界面。 |
Standard | 多实例 | 用户在使用分屏功能时,希望使用两个不同应用(例如备忘录应用和图库应用)之间进行分屏,也希望能使用同一个应用(例如备忘录应用自身)进行分屏。 |
Specified | 指定实例 | 用户打开文档应用,从文档应用中打开一个文档内容,回到文档应用,继续打开同一个文档,希望打开的还是同一个文档内容;以及在文档应用中新建一个新的文档,每次新建文档,希望打开的都是一个新的空白文档内容。 |
启动模式修改
在module.json5中通过launchType配置具体的启动模式,缺省情况下是singleton模式
"abilities": [
{
"name": "EntryAbility",
"launchType": "singleton"
}
]
Ability创建
使用DevEcoStudio工具,在工程main目录下,点击鼠标右键> New > Ability
在创建的Ability文件中修改指定的页面路径pages/Page1
windowStage.loadContent('pages/Page1', (err) => {
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.');
});
UIAbility启动流程
Stage模型下,每个Ability中都包含了一个 Context属性。UIAbilityContext属性为AbilityContext类,通过调用AbiityContext类的startAbility()方法即可启动。
代码实现
Button("jump to Ability1")
.fontSize(30)
.onClick(()=>{
let context = getContext(this) as common.UIAbilityContext
let want:Want ={
deviceId:"",
bundleName: "com.example.myapplication2",//从app.json5获取
moduleName:"entry",//从module.json5获取
abilityName:"Ability1"//跳转的Ability名字
}
context.startAbility(want)//启动Ability
})
思考题
1. Stage模型可以分为UIAbility组件和ExtensionAbility组件两大类。(A)
A. 正确
B. 错误
2. Ability的生命周期包括以下哪几种状态?(ABCD)
A. Create
B. Foreground
C. Background
D. Destroy