当前位置:   article > 正文

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(五)_terminateselfwithresult

terminateselfwithresult

UIAbility组件间交互(设备内)
UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他UIAbility,也可以是其他应用的UIAbility(例如启动三方支付UIAbility)。
本文将从如下场景分别介绍设备内UIAbility间的交互方式。
启动应用内的UIAbility。启动应用内的UIAbility并获取返回结果。启动其他应用的UIAbility。启动其他应用的UIAbility并获取返回结果。启动UIAbility的指定页面。通过Call调用实现UIAbility交互(仅对系统应用开放)。
一、启动应用内的UIAbility
当一个应用内包含多个UIAbility时,存在应用内启动UIAbility的场景。例如在支付应用中从入口UIAbility启动收付款UIAbility。
假设应用中有两个UIAbility:EntryAbility和FuncAbility(可以在应用的一个Module中,也可以在的不同Module中),需要从EntryAbility的页面中启动FuncAbility。
1.在EntryAbility中,通过调用startAbility()方法启动UIAbility,want为UIAbility实例启动的入口参数,其中bundleName为待启动应用的Bundle名称,abilityName为待启动的UIAbility名称,moduleName在待启动的UIAbility属于不同的Module时添加,parameters为自定义信息参数。示例中的context的获取方式参见获取UIAbility的Context属性。

  1. let wantInfo = {
  2. deviceId: '', // deviceId为空表示本设备
  3. bundleName: 'com.example.myapplication',
  4. abilityName: 'FuncAbility',
  5. moduleName: 'module1', // moduleName非必选
  6. parameters: { // 自定义信息
  7. info: '来自EntryAbility Index页面',
  8. },
  9. }
  10. // context为调用方UIAbility的AbilityContext
  11. this.context.startAbility(wantInfo).then(() => {
  12. // ...
  13. }).catch((err) => {
  14. // ...
  15. })

2.在FuncAbility的生命周期回调文件中接收EntryAbility传递过来的参数。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. import Window from '@ohos.window';
  3. export default class FuncAbility extends UIAbility {
  4. onCreate(want, launchParam) {
  5. // 接收调用方UIAbility传过来的参数
  6. let funcAbilityWant = want;
  7. let info = funcAbilityWant?.parameters?.info;
  8. // ...
  9. }
  10. }

3.在FuncAbility业务完成之后,如需要停止当前UIAbility实例,在FuncAbility中通过调用terminateSelf()方法实现。

  1. // context为需要停止的UIAbility实例的AbilityContext
  2. this.context.terminateSelf((err) => {
  3. // ...
  4. });

二、启动应用内的UIAbility并获取返回结果
在一个EntryAbility启动另外一个FuncAbility时,希望在被启动的FuncAbility完成相关业务后,能将结果返回给调用方。例如在应用中将入口功能和帐号登录功能分别设计为两个独立的UIAbility,在帐号登录UIAbility中完成登录操作后,需要将登录的结果返回给入口UIAbility。
1.在EntryAbility中,调用startAbilityForResult()接口启动FuncAbility,异步回调中的data用于接收FuncAbility停止自身后返回给EntryAbility的信息。示例中的context的获取方式参见获取UIAbility的Context属性。

  1. let wantInfo = {
  2. deviceId: '', // deviceId为空表示本设备
  3. bundleName: 'com.example.myapplication',
  4. abilityName: 'FuncAbility',
  5. moduleName: 'module1', // moduleName非必选
  6. parameters: { // 自定义信息
  7. info: '来自EntryAbility Index页面',
  8. },
  9. }
  10. // context为调用方UIAbility的AbilityContext
  11. this.context.startAbilityForResult(wantInfo).then((data) => {
  12. // ...
  13. }).catch((err) => {
  14. // ...
  15. })

2.在FuncAbility停止自身时,需要调用terminateSelfWithResult()方法,入参abilityResult为FuncAbility需要返回给EntryAbility的信息。

  1. const RESULT_CODE: number = 1001;
  2. let abilityResult = {
  3. resultCode: RESULT_CODE,
  4. want: {
  5. bundleName: 'com.example.myapplication',
  6. abilityName: 'FuncAbility',
  7. moduleName: 'module1',
  8. parameters: {
  9. info: '来自FuncAbility Index页面',
  10. },
  11. },
  12. }
  13. // context为被调用方UIAbility的AbilityContext
  14. this.context.terminateSelfWithResult(abilityResult, (err) => {
  15. // ...
  16. });

3.FuncAbility停止自身后,EntryAbility通过startAbilityForResult()方法回调接收被FuncAbility返回的信息,RESULT_CODE需要与前面的数值保持一致。

  1. const RESULT_CODE: number = 1001;
  2. // ...
  3. // context为调用方UIAbility的AbilityContext
  4. this.context.startAbilityForResult(want).then((data) => {
  5. if (data?.resultCode === RESULT_CODE) {
  6. // 解析被调用方UIAbility返回的信息
  7. let info = data.want?.parameters?.info;
  8. // ...
  9. }
  10. }).catch((err) => {
  11. // ...
  12. })

三、启动其他应用的UIAbility
启动其他应用的UIAbility,通常用户只需要完成一个通用的操作(例如需要选择一个文档应用来查看某个文档的内容信息),推荐使用隐式Want启动。系统会根据调用方的want参数来识别和启动匹配到的应用UIAbility。
启动UIAbility有显式Want启动和隐式Want启动两种方式。
显式Want启动:启动一个确定应用的UIAbility,在want参数中需要设置该应用bundleName和abilityName,当需要拉起某个明确的UIAbility时,通常使用显式Want启动方式。

隐式Want启动:根据匹配条件由用户选择启动哪一个UIAbility,即不明确指出要启动哪一个UIAbility(abilityName参数未设置),在调用startAbility()方法时,其入参want中指定了一系列的entities字段(表示目标UIAbility额外的类别信息,如浏览器、视频播放器)和actions字段(表示要执行的通用操作,如查看、分享、应用详情等)等参数信息,然后由系统去分析want,并帮助找到合适的UIAbility来启动。当需要拉起其他应用的UIAbility时,开发者通常不知道用户设备中应用的安装情况,也无法确定目标应用的bundleName和abilityName,通常使用隐式Want启动方式。
本部分主要讲解如何通过隐式Want启动其他应用的UIAbility。
1.将多个待匹配的文档应用安装到设备,在其对应UIAbility的module.json5配置文件中,配置skills的entities字段和actions字段。

  1. {
  2. "module": {
  3. "abilities": [
  4. {
  5. // ...
  6. "skills": [
  7. {
  8. "entities": [
  9. // ...
  10. "entity.system.default"
  11. ],
  12. "actions": [
  13. // ...
  14. "ohos.want.action.viewData"
  15. ]
  16. }
  17. ]
  18. }
  19. ]
  20. }
  21. }

2.在调用方want参数中的entities和action需要被包含在待匹配UIAbility的skills配置的entities和actions中。系统匹配到符合entities和actions参数条件的UIAbility后,会弹出选择框展示匹配到的UIAbility实例列表供用户选择使用。示例中的context的获取方式参见获取UIAbility的Context属性。

  1. let wantInfo = {
  2. deviceId: '', // deviceId为空表示本设备
  3. // uncomment line below if wish to implicitly query only in the specific bundle.
  4. // bundleName: 'com.example.myapplication',
  5. action: 'ohos.want.action.viewData',
  6. // entities can be omitted.
  7. entities: ['entity.system.default'],
  8. }
  9. // context为调用方UIAbility的AbilityContext
  10. this.context.startAbility(wantInfo).then(() => {
  11. // ...
  12. }).catch((err) => {
  13. // ...
  14. })

效果示意如下图所示,点击“打开PDF文档”时,会弹出选择框供用户选择。
 

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(五)-开源基础软件社区


3.在文档应用使用完成之后,如需要停止当前UIAbility实例,通过调用terminateSelf()方法实现。

  1. // context为需要停止的UIAbility实例的AbilityContext
  2. this.context.terminateSelf((err) => {
  3. // ...
  4. });

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/336352
推荐阅读
相关标签
  

闽ICP备14008679号