Ability入门

Ability在英文中是能力的意思,在这里是指应用所具备能力的抽象,同时是应用程序的重要组成部分。一个应用可以包含一个或多个FA/PA,其中,FA有UI界面,提供与用户交互的能力;而PA无UI界面,提供后台运行任务的能力以及统一的数据访问抽象。基于FA/PA开发的应用,能够实现特定的业务功能,支持跨设备调度与分发,为用户提供一致、高效的应用体验。

目前Ability框架模型具有两种形态。

  • 第一种形态为FA模型。支持API 8及其更早版本。
  • 第二种形态为Stage模型。从API 9开始支持。

这里我们就拿API 8及其更早版本中的FA来说。学习能够看得见的Ability内部的页面跳转和Ability之间的页面跳转。激发大家的学习兴趣。

先来预览一下今天的一个效果。

Ability入门_bundle

接下来,我们创建一个项目AbilityDemo

Ability入门_bundle_02

等待依赖加载完成之后

先进行一个签名

Ability入门_bundle_03

这个时候,就可以安装到dayu200上

接下来就到今天最关键的的学习环节了

1.Ability内页面跳转(不带参数)

  • 在eTS目录如下,pages目录下有index.ets和second.ets;
  • Ability入门_页面跳转_04

实现:

在index.ets中引入router模块;

import router from '@system.router';

@Entry
@Component
struct Index {
@State message: string = 'Ability内页面跳转(不带参数)'

build() {
Row() {
Column() {
Text(this.message)
.fontSize(20)
.fontWeight(FontWeight.Bold).onClick(()=>{

// 跳转按钮绑定onClick事件,点击时跳转到第二页
router.push({uri:"pages/second"})
})


}
.width('100%')
}
.height('100%')
}
}

为按钮添加点击事件,点击后跳转到second页面,使用router.push实现跳转;

2.Ability内页面跳转(携带参数)

在eTS目录如下,pages目录下有index.ets和third.ets;

Ability入门_json_05

我们这次用Navigator组件,来携带参数跳转

import router from '@system.router';

@Entry
@Component
struct Index {

@State content: object = { name: '我是上一个页面携带的数据' }

build() {
Row() {
Column() {
Navigator({ target: 'pages/third', type: NavigationType.Push }) {
Text("Ability内页面跳转(携带参数)").fontSize(20)
.width('100%').textAlign(TextAlign.Center)
}
//跳转时要同时传递到目标页面的数据,可在目标页面使用router.getParams()获得。
.params({ text: this.content })
}
}.width('100%').height('100%')

}
}

Third.page

import router from '@system.router'

@Entry
@Component
struct Thrid {
// 通过router接收上一个页面传递的参数
// @ts-ignore
@State text: any = router.getParams().text
build() {
Row() {
Column() {
Text(this.text['name'])
.fontSize(50)
.fontWeight(FontWeight.Bold).onClick(() => {
router.back()
})
}
.width('100%')
}
.height('100%')
}
}

3.跳转到指定Ability首页

  • 新建Ability,名为SecondAbility,在ets目录下右键新建New->Ability->Empty Page Ability(eTS);

Ability入门_页面跳转_06

目录如图所示:

Ability入门_bundle_07

  1. 在MainAbility/pages/index.ets中引入featureAbility模块;
import featureAbility from '@ohos.ability.featureAbility';
  1. 在MainAbility/pages/index.ets中添加按钮,并为按钮添加文本、样式和点击事件,点击后跳转到SecondAbility的index页面,通过featureAbility.startAbility实现,调用featureAbility.startAbility时,这里参数want里主要传递bundleName和abilityName;详情请参看启动本地PageAbility。点击按钮触发点击事件后会默认跳转到MainAbility2的index页面。
import featureAbility from '@ohos.ability.featureAbility';
Text("跳转到指定Ability首页")
.fontSize(20)
.fontWeight(FontWeight.Bold).onClick(() => {
//启动Ability
let str = {
"want": {
//设备Id,本机默认为空
deviceId:"",
//app名称,在config.json的bundleName
bundleName:"com.jianguo.abilitydemo",
//页面名称,注意包名
abilityName:"com.jianguo.entry.SecondAbility"

},
};
featureAbility.startAbility(str)
.then((data) => {
console.info('Operation successful. Data: ' + JSON.stringify(data))
}).catch((error) => {
console.error('Operation failed. Cause: ' + JSON.stringify(error));
})
})

然后我对上面的参数做个说明

  • deviceId:进行说明本机默认为空,
  • bundleName:在 config.json 的 bundleName
  • abilityName:页面名称,注意包名

4.跳转到指定Ability指定页

  • 在名为SecondAbility中,新建second.ets

Ability入门_前端_08

import featureAbility from '@ohos.ability.featureAbility';
Text("跳转到指定Ability页面")
.fontSize(20)
.fontWeight(FontWeight.Bold).onClick(() => {
//启动Ability
let str = {
"want": {
//设备Id,本机默认为空
deviceId:"",
//app名称,在config.json的bundleName
bundleName:"com.jianguo.abilitydemo",
//页面名称,注意包名
abilityName:"com.jianguo.abilitydemo.SecondAbility",
parameters: {
url: 'pages/second'
}
},
};
featureAbility.startAbility(str)
.then((data) => {
console.info('Operation successful. Data: ' + JSON.stringify(data))
}).catch((error) => {
console.error('Operation failed. Cause: ' + JSON.stringify(error));
})
})

路径src/main/ets/SecondAbility/pages/second.ets

import router from '@ohos.router';
@Entry
@Component
struct Second {
@State message: string = '我是Ability的Second页面'

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

好的,通过今天的整理,我们把Ability相关的一些技术点也做了一些了解,学到了四个小知识点。

下一期的内容,我会带领大家实现远程FA的启动。

源码地址

参考资料

[ Ability框架概述](zh-cn/application-dev/ability/ability-brief.md · OpenHarmony/docs - Gitee.com)

FA模型综述

Stage模型综述

Navigator

[Want](OpenAtom OpenHarmony)