基本概念
UIAbility组件是一种包罗UI的应用组件,主要用于和用户交互。
在项目创建时,体系默认生成的EntryAbility类继续了UIAbility类。
ExtensionAbility组件:是基于特定场景(比方服务卡片、输入法等)提供的应用组件。每一个详细场景对应一个ExtensionAbilityType,开发者只能利用体系已定义的范例。
在这里可以直接创建差异范例的ExtensionAbility组件文件
HAP:应用安装的基本单位,一个APP可以包罗一个或多个HAP。
包罗UIAbility组件或者ExtensionAbility组件的Module可以单独运行。该范例Module运行时会编译生成一个.hap文件
AbilityStage:Module级别的组件容器。
当HAP中的代码首次被加载到历程中时(Module初始化),体系起首会创建一个AbilityStage实例,可以管理Module中的UIAbility组件和ExtensionAbility组件。
AbilityStage与编译期的HAP是逐一对应的关系
在开发时,一个项目可能必要包罗一个或者多个可以单独运行的Module,对应即为一个Application包罗一个或多个AbilityStage。
在运行期,每个AbilityStage持有该Module上定义的UIAbility组件和ExtensionAbility组件。AbilityStage与Module逐一对应,即一个Module拥有一个AbilityStage。
当UIAbility组件首次启动时,体系会为UIAbility组件创建实例,并将该实例与持有它的AbilityStage实例相干联。
应用组件与窗口生命周期
- 业务逻辑和UI逻辑分离
- 便于体系对应用组件进行裁剪(无屏装备可裁剪窗口)
- 在多装备(如桌面装备和移动装备)上,应用组件可利用同一套生命周期
在UIAbility的onCreate()的生命周期回调函数中,我们可以在该函数中初始化业务逻辑,比方变量定义,资源预加载等,用于后续的UI展示。
在这张图中,我们可以看到应用组价和窗口的生命周期是松耦合的,这种模式有如下好处:
- 业务逻辑和UI逻辑分离,可以在UIAbility组件中处理与页面无关的业务逻辑。在WindowStage持有的窗口上通过ArkUI处理界面相干的业务逻辑。
- 便于体系对应用组件进行裁剪,比方对于无屏装备,体系在运行应用时不会创建窗口模块,有利于减少体系ROM空间占用。
- 在多装备如桌面装备和移动装备上,应用组件可利用同一套生命周期,应用运行时,体系会自动判定装备,并根据差异装备的窗口形态变更,执行差异的生命周期变化流程。
在差异装备上任务切换场景组件生命周期变化举例。
AbilityStage组件容器
AbilityStage是Module级别的组件容器,HAP的运行期类。
生命周期回调函数:
- onCreate():AbilityStage实例创建完成之后触发的回调函数。
- onAcceptWant():指定实例模式的UIAbility组件启动时触发的回调函数。
- onConfigurationUpdated():体系发生全局配置变化时的回调函数。
- onMemoryLevel():体系决定调解内存时的回调函数。
如果必要利用AbilityStage的能力,我们必要新建目次和文件,并自定义继续AbilityStage的类。
可以根据必要重写AbilityStage的四个回调函数
- export default class MyAbilityStage extends AbilityStage {
- onCreate() {
- //HAP在首次加载的时候执行,可以在此函数中为该Module做初始化操作。
- ...
- }
- onAcceptWant(want:Want) {
- //UIAbility组件指定实例启动模式下触发,返回的字符串为UIAbility实例的唯一标识。
- ...
- return 'specifiedUIAbilityInstanceKey';
- }
- }
复制代码 定义好类之后,我们必要配置HAP加载入口
- // module.json5
- {
- "module":{
- "name":"entry",
- "type":"entry",
- "srcEntry":"./ets/myabilitystage/MyAbilityStage.ets",
- ...
- }
- }
复制代码 UIAbility组件启动模式
- 单实例启动模式(singleton):该启动模式为默认启动模式,体系运行时,同一UIAbility组件只存在唯一实例。
- 多实例启动模式(multiton):体系每次启动UIAbility组件,都会创建一个新的该范例UIAbility实例。(即在任务视图中可以看到有多个该范例的任务)
- 指定实例启动模式(specified):支持拉起指定key值的UIAbility实例。体系每次拉起指定key值的UIAbility实例,若key值不存在,则创建一个新的实例。
配置如下:
- // module.json5
- {
- "module":{
- ...
- "abilities": {
- ...
- launchType:"singleton"
- }
- }
- }
复制代码 Want
UIAbility组件间交互载体:Want
Want是对象间信息传递的载体,用于在应用组件之间传递信息
显式Want启动UIAbility组件开发
- //调用方页面
- // 获取UIAbilityContext
- let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
- //创建Want。指定应用包名和Ability名
- let want: Want = {
- deviceId: '', //指定拉起的应用所在设备,deviceId为空表示本设备
- bundleName: 'com.example.myapplication', //指定拉起的应用包名
- abilityName: 'FuncAbility', //指定拉起的Ability名
- moduleName: 'func', //指定拉起的Ability内的模块名
- parameters: { //自定义信息
- info: '来自EntryAbility Index页面'
- }
- }
-
- //根据Want拉起对应Ability,
- //调用启动函数,传入Want参数
- context.startAbility(want).then(()=>{
- //启动成功
- }).catch((err: BusinessError)=>{
- //启动失败
- })
-
- //被调用方UIAbility文件
- //接收want,获取调用方信息
- export default class FuncAbility extends UIAbility {
- ...
- onCreate(want: Want) {
- //接受调用方UIAbility传过来的参数
- let info = want.parameters?.info;
- ...
- }
- }
复制代码 隐式Want启动UIAbility组件开发
- //设置被调用方的module.json5
- {
- "module":{
- "abilities": [
- {
- ...
- "skills": [
- {
- //设置UIAbility支持的能力类型,如浏览器类型
- "entities": [
- ...
- "entity.system.browsable"
- ],
- //设置UIAbility支持的操作,如查看数据
- "actions":[
- ...
- "ohos.want.action.viewData"
- ]
- ...
- }
- ]
- }
- ]
- }
- }
- //调用方页面
- //获取UIAbilityContext
- let context:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
- //创建Want,设置action和entities匹配条件。在Want中不指定abilityName字段,而是指定一系列筛选条件
- let want:Want = {
- action: 'ohos.want.action.viewData',
- entities: ['entity.system.browsable'],
- url: 'https://www.huawei.com/cn/'
- }
- //拉起UIAbility
- //调用启动函数,传入Want参数
- context.startAbility(want).then(()=>{
- //启动成功
- }).catch((err: BusinessError)=>{
- //启动失败
- })
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |