(六)鸿蒙HarmonyOS开发-Stage模型

系列文章目录

(零)鸿蒙HarmonyOS入门:如何配置环境,输出“Hello World“
(一)鸿蒙HarmonyOS开发基础
(二)鸿蒙HarmonyOS主力开发语言ArkTS-基本语法
(三)鸿蒙HarmonyOS主力开发语言ArkTS-状态管理
(四)鸿蒙HarmonyOS主力开发语言ArkTS-渲染控制
(五)鸿蒙HarmonyOS主力开发语言ArkTS-数据懒加载(LazyForEach)



前言

HarmonyOS应用模型的要素包括:

应用组件:基本组成单位,运行入口。通过生命周期回调感知状态变化。编写应用时,先编写应用组件及其生命周期回调函数,并在配置文件中配置信息。操作系统通过配置文件创建实例并调度生命周期回调函数。

应用进程模型:定义进程的创建、销毁及通信方式。

应用线程模型:定义线程创建、销毁、主线程和UI线程创建方式及线程间通信方式。

应用配置文件:包含应用配置、组件信息、权限、开发者自定义等。提供给编译工具、应用市场和操作系统使用。

随着系统的演进发展,HarmonyOS先后提供了两种应用模型:

FA(Feature Ability)模型:HarmonyOS早期版本开始支持的模型,已经不再主推。

Stage模型:HarmonyOS 3.1 Developer Preview版本开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。

Stage模型之所以成为主推模型,源于其设计思想。

提示:以下是本篇文章正文内容

一、Stage模型开发概述

图1: Stage模型概念图
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • AbilityStage

每个Entry或Feature HAP在运行期都有一个AbilityStage实例,当HAP代码首次加载时创建。

  • UIAbility组件和ExtensionAbility组件
  • UIAbility: 包含UI界面的应用组件,用于与用户交互。例如,图库应用展示图片瀑布流。其生命周期包括创建、销毁、前台、后台等状态。
  • ExtensionAbility: 面向特定场景的应用组件。开发者使用其派生类,如FormExtensionAbility(卡片场景)和WorkSchedulerExtensionAbility(闲时任务场景)。派生类实例由用户触发创建,系统管理其生命周期。
  • WindowStage

每个UIAbility实例绑定一个WindowStage实例,作为应用进程内窗口管理器,包含一个主窗口,为ArkUI提供绘制区域。

  • Context

在Stage模型上,Context及其派生类提供运行期可调用的能力。UIAbility和ExtensionAbility派生类都有各自的Context类,继承自基类Context,提供不同能力。

开发流程

表1: Stage模型开发流程

任务简介相关指导
应用组件开发使用Stage模型的UIAbility和ExtensionAbility组件开发应用- 应用/组件级配置 - UIAbility组件 - ExtensionAbility组件 - AbilityStage组件容器 - 应用上下文Context
了解进程模型介绍Stage模型的进程模型及进程间通信方式- 公共事件
了解线程模型介绍Stage模型的线程模型及线程间通信方式- Emitter - Worker
应用配置文件介绍Stage模型应用配置文件的开发要求

二、Stage模型应用组件

应用/组件级配置

开发应用时,需配置应用的包名、图标等标识特征属性。本文概述了关键配置标签。图标和标签分为应用图标/标签和入口图标/标签,分别在app.json5和module.json5文件的icon和label标签中配置。应用图标和标签用于设置应用,如应用列表;入口图标显示于设备桌面,支持多个入口图标和标签,点击后进入相应UIAbility界面。

UIAbility组件

UIAbility组件概述

UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。

UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。

声明配置

为使应用能够正常使用UIAbility,需要在module.json5配置文件的abilities标签中声明UIAbility的名称、入口、标签等相关信息。

{
  "module": {
    // ...
    "abilities": [
      {
        "name": "EntryAbility", // UIAbility组件的名称
        "srcEntry": "./ets/entryability/EntryAbility.ts", // 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组件启动页面背景颜色资源文件的索引
        // ...
      }
    ]
  }
}

注意:上述代码仅为示例,实际开发过程中需要根据具体情况进行配置。

UIAbility组件生命周期

当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,或者UIAbility实例发生了前后台的状态切换。

UIAbility的生命周期

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

生命周期状态说明

Create状态

Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调用onCreate()回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的UI界面展示。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 页面初始化
    }
    // ...
}
WindowStageCreate和WindowStageDestroy状态

UIAbility实例创建完成之后,在进入Foreground之前,系统会创建一个WindowStageWindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI界面加载、设置WindowStage的事件订阅。

onWindowStageCreate()回调中通过loadContent()方法设置应用要加载的页面并根据需要订阅WindowStage的事件(获焦/失焦、可见/不可见)。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: Window.WindowStage) {
        // 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)

        // 设置UI界面加载
        windowStage.loadContent('pages/Index', (err, data) => {
            // ...
        });
    }
}

说明WindowStage的相关使用请参见窗口开发指导。

对应于onWindowStageCreate()回调。在UIAbility实例销毁之前,则会先进入onWindowStageDestroy()回调,可以在该回调中释放UI界面资源。例如在onWindowStageDestroy()中注销获焦/失焦等WindowStage事件。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    // ...

    onWindowStageDestroy() {
        // 释放UI界面资源
    }
}
Foreground和Background状态

Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。

onForeground()回调,在UIAbility的UI界面可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。

onBackground()回调,在UIAbility的UI界面完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI界面不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。

例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI界面显示之前,可以在onForeground()回调中开启定位功能,从而获取到当前的位置信息。

当应用切换到后台状态,可以在onBackground()回调中停止定位功能,以节省系统的资源消耗。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    onForeground() {
        // 申请系统需要的资源,或者重新申请在onBackground中释放的资源
    }

    onBackground() {
        // 释放UI界面不可见时无用的资源,或者在此回调中执行较为耗时的操作
        // 例如状态保存等
    }
}
Destroy状态

Destroy状态在UIAbility实例销毁时触发。可以在onDestroy()回调中进行系统资源的释放、数据的保存等操作。

例如调用terminateSelf()方法停止当前UIAbility实例,从而完成UIAbility实例的销毁;或者用户使用最近任务列表关闭该UIAbility实例,完成UIAbility的销毁

UIAbility组件启动模式

在这里插入图片描述

UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式

singleton启动模式

singleton启动模式为单实例模式,也是默认情况下的启动模式。

每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例。系统中只存在唯一一个该UIAbility实例,即在最近任务列表中只存在一个该类型的UIAbility实例。

说明

应用的UIAbility实例已创建,该UIAbility配置为单实例模式,再次调用startAbility()方法启动该UIAbility实例,此时只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。

如果需要使用singleton启动模式,在module.json5配置文件中的"launchType"字段配置为"singleton"即可。

{
  "module": {
    // ...
    "abilities": [
      {
        "launchType": "singleton",
        // ...
      }
    ]
  }
}

multiton启动模式

multiton启动模式为多实例模式,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。这种情况下可以将UIAbility配置为multiton(多实例模式)。


图2 多实例模式演示效果

multiton启动模式的开发使用,在module.json5配置文件中的"launchType"字段配置为"multiton"即可。

{
  "module": {
    // ...
    "abilities": [
      {
        "launchType": "multiton",
        // ...
      }
    ]
  }
}

specified启动模式

specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。

在UIAbility实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的UIAbility实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility()请求。运行时由UIAbility内部业务决定是否创建多实例,如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。

图3 指定实例模式演示效果

说明

应用的UIAbility实例已创建,该UIAbility配置为指定实例模式,再次调用startAbility()方法启动该UIAbility实例,且AbilityStage的onAcceptWant()回调匹配到一个已创建的UIAbility实例。此时,再次启动该UIAbility时,只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。

例如有两个UIAbility:EntryAbility和FuncAbility,FuncAbility配置为specified启动模式,需要从EntryAbility的页面中启动FuncAbility。

1.在FuncAbility中,将module.json5配置文件的"launchType"字段配置为"specified"。

{
  "module": {
    // ...
    "abilities": [
      {
        "launchType": "specified",
        // ...
      }
    ]
  }
}

2.在EntryAbility中,调用startAbility()方法时,在want参数中,增加一个自定义参数来区别UIAbility实例,例如增加一个"instanceKey"自定义参数。

// 在启动指定实例模式的UIAbility时,给每一个UIAbility实例配置一个独立的Key标识
// 例如在文档使用场景中,可以用文档路径作为Key标识
function getInstance() {
    // ...
}

let want = {
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
    moduleName: 'module1', // moduleName非必选
    parameters: { // 自定义信息
        instanceKey: getInstance(),
    },
}
// context为调用方UIAbility的AbilityContext
this.context.startAbility(want).then(() => {
    // ...
}).catch((err) => {
    // ...
})

3.由于FuncAbility的启动模式配置为了指定实例启动模式,在FuncAbility启动之前,会先进入其对应的AbilityStage的onAcceptWant()生命周期回调中,解析传入的want参数,获取"instanceKey"自定义参数。根据业务需要通过AbilityStage的onAcceptWant()生命周期回调返回一个字符串Key标识。如果返回的Key对应一个已启动的UIAbility,则会将之前的UIAbility拉回前台并获焦,而不创建新的实例,否则创建新的实例并启动。

import AbilityStage from '@ohos.app.ability.AbilityStage';

export default class MyAbilityStage extends AbilityStage {
    onAcceptWant(want): string {
        // 在被调用方的AbilityStage中,针对启动模式为specified的UIAbility返回一个UIAbility实例对应的一个Key值
        // 当前示例指的是module1 Module的FuncAbility
        if (want.abilityName === 'FuncAbility') {
            // 返回的字符串Key标识为自定义拼接的字符串内容
            return `ControlModule_EntryAbilityInstance_${want.parameters.instanceKey}`;
        }

        return '';
    }
}

例如在文档应用中,可以对不同的文档实例内容绑定不同的Key值。当每次新建文档的时候,可以传入不同的新Key值(如可以将文件的路径作为一个Key标识),此时AbilityStage中启动UIAbility时都会创建一个新的UIAbility实例;当新建的文档保存之后,回到桌面,或者新打开一个已保存的文档,回到桌面,此时再次打开该已保存的文档,此时AbilityStage中再次启动该UIAbility时,打开的仍然是之前原来已保存的文档界面。

以如下步骤所示进行举例说明。

打开文件A,对应启动一个新的UIAbility实例,例如启动“UIAbility实例1”。

在最近任务列表中关闭文件A的进程,此时UIAbility实例1被销毁,回到桌面,再次打开文件A,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例2”。

回到桌面,打开文件B,此时对应启动一个新的UIAbility实例,例如启动“UIAbility实例3”。

回到桌面,再次打开文件A,此时对应启动的还是之前的“UIAbility实例2”。

UIAbility组件基本用法

指定UIAbility的启动页面

在OHOS应用中,UIAbility启动时需指定加载页面,否则可能出现白屏。可通过WindowStage对象的loadContent()方法在onWindowStageCreate()回调中设置启动页面。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
    onWindowStageCreate(windowStage: Window.WindowStage) {
        windowStage.loadContent('pages/Index', (err, data) => {
            // ...
        });
    }
}

在DevEco Studio中,默认加载Index页面,可按需替换。

获取UIAbility的上下文信息

UIAbility类拥有UIAbilityContext实例,包含配置信息和操作方法。通过this.context可获取上下文。

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        let context = this.context;
        // ...
    }
}

在页面中获取上下文,需导入context模块并定义变量。

import common from '@ohos.app.ability.common';

@Entry
@Component
struct Index {
    private context = getContext(this) as common.UIAbilityContext;

    startAbilityTest() {
        let want = {};
        this.context.startAbility(want);
    }

    build() {
        // ...
    }
}

或在具体使用前定义变量。

import common from '@ohos.app.ability.common';

@Entry
@Component
struct Index {
    startAbilityTest() {
        let context = getContext(this) as common.UIAbilityContext;
        let want = {};
        context.startAbility(want);
    }

    build() {
        // ...
    }
}

UIAbility组件与UI的数据同步

在这里插入图片描述

基于HarmonyOS的应用模型,可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。

使用EventHub进行数据通信


EventHub提供了UIAbility组件/ExtensionAbility组件级别的事件机制,以UIAbility组件/ExtensionAbility组件为中心提供了订阅、取消订阅和触发事件的数据通信能力。接口说明请参见EventHub

在使用EventHub之前,首先需要获取EventHub对象。基类Context提供了EventHub对象,本章节以使用EventHub实现UIAbility与UI之间的数据通信为例进行说明。

  1. 在UIAbility中调用eventHub.on()方法注册一个自定义事件“event1”,eventHub.on()有如下两种调用方式,使用其中一种即可。

    
    1.  import UIAbility from '@ohos.app.ability.UIAbility';
    
    3.  const TAG: string = '[Example].[Entry].[EntryAbility]';
    
    5.  export default class EntryAbility extends UIAbility {
    6.      func1(...data) {
    7.          // 触发事件,完成相应的业务操作
    8.          console.info(TAG, '1. ' + JSON.stringify(data));
    9.      }
    
    11.      onCreate(want, launch) {
    12.          // 获取eventHub
    13.          let eventhub = this.context.eventHub;
    14.          // 执行订阅操作
    15.          eventhub.on('event1', this.func1);
    16.          eventhub.on('event1', (...data) => {
    17.              // 触发事件,完成相应的业务操作
    18.              console.info(TAG, '2. ' + JSON.stringify(data));
    19.          });
    20.      }
    21.  }
    
    
    
  2. 在UI界面中通过eventHub.emit()方法触发该事件,在触发事件的同时,根据需要传入参数信息。

    
    1.  import common from '@ohos.app.ability.common';
    
    3.  @Entry
    4.  @Component
    5.  struct Index {
    6.    private context = getContext(this) as common.UIAbilityContext;
    
    8.    eventHubFunc() {
    9.      // 不带参数触发自定义“event1”事件
    10.      this.context.eventHub.emit('event1');
    11.      // 带1个参数触发自定义“event1”事件
    12.      this.context.eventHub.emit('event1', 1);
    13.      // 带2个参数触发自定义“event1”事件
    14.      this.context.eventHub.emit('event1', 2, 'test');
    15.      // 开发者可以根据实际的业务场景设计事件传递的参数
    16.    }
    
    18.    // 页面展示
    19.    build() {
    20.      // ...
    21.    }
    22.  }
    
    
    
  3. 在UIAbility的注册事件回调中可以得到对应的触发事件结果,运行日志结果如下所示。

    
    1.  []
    
    3.  [1]
    
    5.  [2,'test']
    
    
    
  4. 在自定义事件“event1”使用完成后,可以根据需要调用eventHub.off()方法取消该事件的订阅。

    
    1.  // context为UIAbility实例的AbilityContext
    2.  this.context.eventHub.off('event1');
    
    
    

使用globalThis进行数据同步


globalThis是ArkTS引擎实例内部的一个全局对象,引擎内部的UIAbility/ExtensionAbility/Page都可以使用,因此可以使用globalThis全局对象进行数据同步。

图1 使用globalThis进行数据同步

UIAbility和Page之间使用globalThis

globalThis为ArkTS引擎实例下的全局对象,可以通过globalThis绑定属性/方法来进行UIAbility组件与UI的数据同步。例如在UIAbility组件中绑定want参数,即可在UIAbility对应的UI界面上使用want参数信息。

  1. 调用startAbility()方法启动一个UIAbility实例时,被启动的UIAbility创建完成后会进入onCreate()生命周期回调,且在onCreate()生命周期回调中能够接受到传递过来的want参数,可以将want参数绑定到globalThis上。

    
    1.  import UIAbility from '@ohos.app.ability.UIAbility'
    
    3.  export default class EntryAbility extends UIAbility {
    4.      onCreate(want, launch) {
    5.          globalThis.entryAbilityWant = want;
    6.          // ...
    7.      }
    
    9.      // ...
    10.  }
    
    
    
  2. 在UI界面中即可通过globalThis获取到want参数信息。

    
    1.  let entryAbilityWant;
    
    3.  @Entry
    4.  @Component
    5.  struct Index {
    6.    aboutToAppear() {
    7.      entryAbilityWant = globalThis.entryAbilityWant;
    8.    }
    
    10.    // 页面展示
    11.    build() {
    12.      // ...
    13.    }
    14.  }
    
    
    

UIAbility和UIAbility之间使用globalThis

同一个应用中UIAbility和UIAbility之间的数据传递,可以通过将数据绑定到全局变量globalThis上进行同步,如在AbilityA中将数据保存在globalThis,然后跳转到AbilityB中取得该数据:

  1. AbilityA中保存数据一个字符串数据并挂载到globalThis上。

    
    1.  import UIAbility from '@ohos.app.ability.UIAbility'
    
    3.  export default class AbilityA extends UIAbility {
    4.      onCreate(want, launch) {
    5.          globalThis.entryAbilityStr = 'AbilityA'; // AbilityA存放字符串“AbilityA”到globalThis
    6.          // ...
    7.      }
    8.  }
    
    
    
  2. AbilityB中获取对应的数据。

    
    1.  import UIAbility from '@ohos.app.ability.UIAbility'
    
    3.  export default class AbilityB extends UIAbility {
    4.      onCreate(want, launch) {
    5.          // AbilityB从globalThis读取name并输出
    6.          console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr);
    7.          // ...
    8.      }
    9.  }
    
    
    

globalThis使用的注意事项

图2 globalThis注意事项


Stage模型上同名对象覆盖导致问题的场景举例说明。

  1. 在AbilityA文件中使用globalThis存放了UIAbilityContext

1.  import UIAbility from '@ohos.app.ability.UIAbility'

3.  export default class AbilityA extends UIAbility {
4.      onCreate(want, launch) {
5.          globalThis.context = this.context; // AbilityA存放context到globalThis
6.          // ...
7.      }
8.  }


  • 在AbilityA的页面中获取该UIAbilityContext并进行使用。使用完成后将AbilityA实例切换至后台。

    
    1.  @Entry
    2.  @Component
    3.  struct Index {
    4.    onPageShow() {
    5.      let ctx = globalThis.context; // 页面中从globalThis中取出context并使用
    6.      let permissions = ['com.example.permission']
    7.      ctx.requestPermissionsFromUser(permissions,(result) => {
    8.         // ...
    9.      });
    10.    }
    11.    // 页面展示
    12.    build() {
    13.      // ...
    14.    }
    15.  }
    
    
    
  • 在AbilityB文件中使用globalThis存放了UIAbilityContext,并且命名为相同的名称。

    
    1.  import UIAbility from '@ohos.app.ability.UIAbility'
    
    3.  export default class AbilityB extends UIAbility {
    4.      onCreate(want, launch) {
    5.          // AbilityB覆盖了AbilityA在globalThis中存放的context
    6.          globalThis.context = this.context;
    7.          // ...
    8.      }
    9.  }
    
    
    
  • 在AbilityB的页面中获取该UIAbilityContext并进行使用。此时获取到的globalThis.context已经表示为AbilityB中赋值的UIAbilityContext内容。

    
    1.  @Entry
    2.  @Component
    3.  struct Index {
    4.    onPageShow() {
    5.      let ctx = globalThis.context; // Page中从globalThis中取出context并使用
    6.      let permissions = ['com.example.permission']
    7.      ctx.requestPermissionsFromUser(permissions,(result) => {
    8.        console.info('requestPermissionsFromUser result:' + JSON.stringify(result));
    9.      });
    10.    }
    11.    // 页面展示
    12.    build() {
    13.      // ...
    14.    }
    15.  }
    
    
    
  • 在AbilityB实例切换至后台,将AbilityA实例从后台切换回到前台。此时AbilityA的onCreate生命周期不会再次进入。

    
    1.  import UIAbility from '@ohos.app.ability.UIAbility'
    
    3.  export default class AbilityA extends UIAbility {
    4.      onCreate(want, launch) { // AbilityA从后台进入前台,不会再走这个生命周期
    5.          globalThis.context = this.context;
    6.          // ...
    7.      }
    8.  }
    
    
    
  • 在AbilityA的页面再次回到前台时,其获取到的globalThis.context表示的为AbilityB的UIAbilityContext,而不是AbilityA的UIAbilityContext,在AbilityA的页面中使用则会出错。

    
    1.  @Entry
    2.  @Component
    3.  struct Index {
    4.    onPageShow() {
    5.      let ctx = globalThis.context; // 这时候globalThis中的context是AbilityB的context
    6.      let permissions=['com.example.permission'];
    7.      ctx.requestPermissionsFromUser(permissions,(result) => { // 使用这个对象就会导致进程崩溃
    8.         console.info('requestPermissionsFromUser result:' + JSON.stringify(result));
    9.      });
    10.    }
    11.    // 页面展示
    12.    build() {
    13.      // ...
    14.    }
    15.  }
    
    
    

使用AppStorage/LocalStorage进行数据同步

ArkUI提供了AppStorage和LocalStorage两种应用级别的状态管理方案,可用于实现应用级别和UIAbility级别的数据同步。使用这些方案可以方便地管理应用状态,提高应用性能和用户体验。其中,AppStorage是一个全局的状态管理器,适用于多个UIAbility共享同一状态数据的情况;而LocalStorage则是一个局部的状态管理器,适用于单个UIAbility内部使用的状态数据。通过这两种方案,开发者可以更加灵活地控制应用状态,提高应用的可维护性和可扩展性。详细请参见应用级变量的状态管理

UIAbility组件间交互(设备内)

在这里插入图片描述

信息传递载体Want

Want的定义与用途

Want是对象间信息传递的载体,特别用于应用组件间的信息传递。例如,当UIAbilityA需要启动UIAbilityB并传递数据时,Want可作为载体。其关键字段包括bundleName和abilityName,分别用于指定目标Ability的应用包名和Ability名称。

Want的类型

  1. 显式Want:指定abilityName和bundleName的Want。用于启动当前应用中已知的Ability。
let wantInfo = {
    deviceId: '', 
    bundleName: 'com.example.myapplication',
    abilityName: 'FuncAbility',
}
  1. 隐式Want:未指定abilityName的Want。用于请求其他应用提供的能力,而不关心具体是哪个应用。
let wantInfo = {
    // bundleName可选
    // bundleName: 'com.example.myapplication',
    action: 'ohos.want.action.search',
    entities: [ 'entity.system.browsable' ],
    uri: 'https://www.test.com:8080/query/student',
    type: 'text/plain',
};

说明

  • 未匹配到满足条件的Ability:启动失败。
  • 匹配到一个满足条件的Ability:直接启动。
  • 匹配到多个满足条件的Ability:弹出选择框让用户选择。

Want参数说明

名称读写属性类型必填描述
deviceId只读string目标Ability所在设备ID。未设置则默认为本设备。
bundleName只读string目标Ability所在应用名称。
moduleName只读string目标Ability所属的模块名称。
abilityName只读string目标Ability名称。未设置则为隐式Want。同时指定bundleName, moduleName和abilityName可直接匹配指定Ability。
uri只读string携带的数据,一般配合type使用,指明数据类型。
type只读string携带数据类型,使用MIME类型规范。
action只读string要执行的通用操作(如查看、分享)。在隐式Want中定义,配合uri或parameters表示对数据要执行的操作。
entities只读Array目标Ability的额外类别信息。在隐式Want中是对action的补充,用于过滤匹配UIAbility类别。
Flags只读number处理Want的方式。例如是否以设备间迁移方式启动Ability。
parameters只读{[key: string]: any}用于传递自定义数据,通过用户自定义的键值对进行数据填充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值