首页 > 其他分享 >HarmonyOS:UIAbility组件间交互(设备内)

HarmonyOS:UIAbility组件间交互(设备内)

时间:2024-11-17 17:44:43浏览次数:3  
标签:info DOMAIN UIAbility NUMBER HarmonyOS TAG hilog 组件

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,包括应用内的其他UIAbility、或者其他应用的UIAbility(例如启动三方支付UIAbility)。

一、启动应用内的UIAbility

当一个应用内包含多个UIAbility时,存在应用内启动UIAbility的场景。例如在支付应用中从入口UIAbility启动收付款UIAbility。

假设应用中有两个UIAbility:EntryAbility和FuncAbility(可以在同一个Module中,也可以在不同的Module中),需要从EntryAbility的页面中启动FuncAbility。

1.在EntryAbility中,通过调用startAbility()方法启动UIAbility,want为UIAbility实例启动的入口参数,其中bundleName为待启动应用的Bundle名称,abilityName为待启动的Ability名称,moduleName在待启动的UIAbility属于不同的Module时添加,parameters为自定义信息参数。示例中的context的获取方式请参见获取UIAbility的上下文信息。

import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[Page_UIAbilityComponentsInteractive]';
const DOMAIN_NUMBER: number = 0xFF00;

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

  build() {
    Column() {
      //...
      List({ initialIndex: 0 }) {
        ListItem() {
          Row() {
            Text('打开 FuncAbilityA')
              .fontSize(20)
              .fontWeight(FontWeight.Medium)
              .margin({ top: 20 })
          }
          .onClick(() => {
            // context为Ability对象的成员,在非Ability对象内部调用需要
            // 将Context对象传递过去
            let wantInfo: Want = {
              deviceId: '', // deviceId为空表示本设备
              bundleName: 'com.samples.stagemodelabilitydevelop',
              moduleName: 'entry', // moduleName非必选
              abilityName: 'FuncAbilityA',
              parameters: {
                // 自定义信息
                info: '来自EntryAbility Page_UIAbilityComponentsInteractive页面'
              },
            };
            // context为调用方UIAbility的UIAbilityContext
            this.context.startAbility(wantInfo).then(() => {
              hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
            }).catch((error: BusinessError) => {
              hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');
            });
          })
        }
        //...
      }
      //...
    }
    //...
  }
}

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

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

const TAG: string = '[FuncAbilityA]';
const DOMAIN_NUMBER: number = 0x0000;
export default class FuncAbilityA extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 接收调用方UIAbility传过来的参数
    let funcAbilityWant = want;
    let info = funcAbilityWant?.parameters?.info;
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', `Ability onCreate 接收到的参数 info = ${info}`);
  }

  onDestroy(): void {
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(DOMAIN_NUMBER, TAG, 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onBackground');
  }
}

效果图
在这里插入图片描述

说明
在被拉起的FuncAbility中,可以通过获取传递过来的want参数的parameters来获取拉起方UIAbility的PID、Bundle Name等信息。

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

// UIAbility组件间交互(设备内)https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497122909477

import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[Page_FromStageModel]';
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@Component
struct Page_FromStageModel {
  build() {
    Column() {
      //...
      Button('打开 FuncAbilityB')
        .onClick(() => {
          let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext
          // 在FuncAbility中通过调用terminateSelf()方法实现。
          // context为需要停止的UIAbility实例的AbilityContext
          let wantInfo: Want = {
            deviceId: '', // deviceId为空表示本设备
            bundleName: 'com.example.learnharmonyos',
            moduleName: 'entry', // moduleName非必选
            abilityName: 'FuncAbilityB',
            parameters: {
              // 自定义信息
              info: '来自EntryAbility Page_FromStageModel'
            },
          }
          context.startAbility(wantInfo).then(() => {
            hilog.info(DOMAIN_NUMBER, TAG, 'startAbility FuncAbilityB success.');
          }).catch((error: BusinessError) => {
            hilog.error(DOMAIN_NUMBER, TAG, 'startAbility FuncAbilityB failed.');
          })
          context.terminateSelf((err) => {
            if (err.code) {
              hilog.error(DOMAIN_NUMBER, TAG,
                `Failed to terminate self. Code is ${err.code}, message is ${err.message}`);
              return;
            }
          });
        })
    }

    //...
  }
}

运行效果图
在这里插入图片描述

说明
调用terminateSelf()方法停止当前UIAbility实例时,默认会保留该实例的快照(Snapshot),即在最近任务列表中仍然能查看到该实例对应的任务。如不需要保留该实例的快照,可以在其对应UIAbility的module.json5配置文件中,将abilities标签的removeMissionAfterTerminate字段配置为true。

4.如需要关闭应用所有的UIAbility实例,可以调用ApplicationContextkillAllProcesses()方法实现关闭应用所有的进程。

二、启动应用内的UIAbility并获取返回结果

在一个EntryAbility启动另外一个FuncAbility时,希望在被启动的FuncAbility完成相关业务后,能将结果返回给调用方。例如在应用中将入口功能和账号登录功能分别设计为两个独立的UIAbility,在账号登录UIAbility中完成登录操作后,需要将登录的结果返回给入口UIAbility。

1.在EntryAbility中,调用startAbilityForResult()接口启动FuncAbility,异步回调中的data用于接收FuncAbility停止自身后返回给EntryAbility的信息。示例中的context的获取方式请参见获取UIAbility的上下文信息。

// UIAbility组件间交互(设备内)https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497122909477

import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[Page_UIAbilityComponentsInteractive]';
const DOMAIN_NUMBER: number = 0xFF00;

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

  build() {
    Column() {
      //...
      List({ initialIndex: 0 }) {
        ListItem() {
          Row() {
            Text('打开 FuncAbilityA')
              .fontSize(20)
              .fontWeight(FontWeight.Medium)
              .margin({ top: 20 })
          }
          .onClick(() => {
            // this.testStartAbilityParameters()
            this.testStartAbilityForResult()
          })
        }

        //...
      }

      //...
    }

    //...
  }

  private wantInfo: Want = {
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.example.learnharmonyos',
    moduleName: 'entry', // moduleName非必选
    abilityName: 'FuncAbilityA',
    parameters: {
      // 自定义信息
      info: '来自EntryAbility Page_UIAbilityComponentsInteractive页面'
    },
  };

  testStartAbilityParameters(): void {
    // context为Ability对象的成员,在非Ability对象内部调用需要
    // 将Context对象传递过去

    // context为调用方UIAbility的UIAbilityContext
    this.context.startAbility(this.wantInfo).then(() => {
      hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
    }).catch((error: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');
    });
  }

  testStartAbilityForResult(): void {
    const RESULT_CODE: number = 1001;
    this.context.startAbilityForResult(this.wantInfo).then((data) => {
      if (data?.resultCode === RESULT_CODE) {
        // 解析被调用方UIAbility返回的信息
        let info = data.want?.parameters?.info;
        hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(info) ?? '');
        if (info !== null) {
          promptAction.showToast({
            message: JSON.stringify(info)
          });
        }
      }
      hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(data.resultCode) ?? '');
    }).catch((err: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG,
        `Failed to start ability for result. Code is ${err.code}, message is ${err.message}`);
    });
  }
}

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


import { common } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = '[Page_FuncAbilityA]';
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@Component
struct Page_FuncAbilityA {
  build() {
    Column() {
      //...
      List({ initialIndex: 0 }) {
        ListItem() {
          Row() {
            Text('Page_FuncAbilityA页面')
              .fontSize(16)
              .fontWeight(FontWeight.Normal)
              .margin({ top: 20 })
          }
          .onClick(() => {
            let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; // UIAbilityContext
            const RESULT_CODE: number = 1001;
            let abilityResult: common.AbilityResult = {
              resultCode: RESULT_CODE,
              want: {
                bundleName: 'com.example.learnharmonyos',
                moduleName: 'entry', // moduleName非必选
                abilityName: 'FuncAbilityB',
                parameters: {
                  info: '来自 Page_FuncAbilityA Index页面'
                },
              },
            };
            context.terminateSelfWithResult(abilityResult, (err) => {
              if (err.code) {
                hilog.error(DOMAIN_NUMBER, TAG,
                  `Failed to terminate self with result. Code is ${err.code}, message is ${err.message}`);
                return;
              }
            });
          })
        }

        //...
      }

      //...
    }

    //...
  }
}

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

运行效果图
在这里插入图片描述

三、启动UIAbility的指定页面

3.1 概述

一个UIAbility可以对应多个页面,在不同的场景下启动该UIAbility时需要展示不同的页面,例如从一个UIAbility的页面中跳转到另外一个UIAbility时,希望启动目标UIAbility的指定页面。

UIAbility的启动分为两种情况:UIAbility冷启动和UIAbility热启动。

  • UIAbility冷启动:指的是UIAbility实例处于完全关闭状态下被启动,这需要完整地加载和初始化UIAbility实例的代码、资源等。
  • UIAbility热启动:指的是UIAbility实例已经启动并在前台运行过,由于某些原因切换到后台,再次启动该UIAbility实例,这种情况下可以快速恢复UIAbility实例的状态。

下文主要讲解目标UIAbility冷启动和目标UIAbility热启动两种启动指定页面的场景,以及在讲解启动指定页面之前会讲解到在调用方如何指定启动页面。

3.2 调用方UIAbility指定启动页面

调用方UIAbility启动另外一个UIAbility时,通常需要跳转到指定的页面。例如FuncAbility包含两个页面(Index对应首页,Second对应功能A页面),此时需要在传入的want参数中配置指定的页面路径信息,可以通过want中的parameters参数增加一个自定义参数传递页面跳转信息。示例中的context的获取方式请参见获取UIAbility的上下文信息。

// UIAbility组件间交互(设备内)https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497122909477

import { common, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { promptAction } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[Page_UIAbilityComponentsInteractive]';
const DOMAIN_NUMBER: number = 0xFF00;

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

  build() {
    Column() {
      //...
      List({ initialIndex: 0 }) {
        ListItem() {
          Row() {
            Text('打开 FuncAbilityA')
              .fontSize(20)
              .fontWeight(FontWeight.Medium)
              .margin({ top: 20 })
          }
          .onClick(() => {
            // this.testStartAbilityParameters()
            // this.testStartAbilityForResult()
            this.testStartAbilityParametersRouter()
          })
        }

        //...
      }

      //...
    }

    //...
  }

  private wantInfo: Want = {
    deviceId: '', // deviceId为空表示本设备
    bundleName: 'com.example.learnharmonyos',
    moduleName: 'entry', // moduleName非必选
    abilityName: 'FuncAbilityA',
    parameters: {
      router:'SecondFuncA',
      // 自定义信息
      info: '来自EntryAbility Page_UIAbilityComponentsInteractive页面'
    },
  };

  testStartAbilityParameters(): void {
    // context为Ability对象的成员,在非Ability对象内部调用需要
    // 将Context对象传递过去

    // context为调用方UIAbility的UIAbilityContext
    this.context.startAbility(this.wantInfo).then(() => {
      hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
    }).catch((error: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');
    });
  }

  testStartAbilityForResult(): void {
    const RESULT_CODE: number = 1001;
    this.context.startAbilityForResult(this.wantInfo).then((data) => {
      if (data?.resultCode === RESULT_CODE) {
        // 解析被调用方UIAbility返回的信息
        let info = data.want?.parameters?.info;
        hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(info) ?? '');
        if (info !== null) {
          promptAction.showToast({
            message: JSON.stringify(info)
          });
        }
      }
      hilog.info(DOMAIN_NUMBER, TAG, JSON.stringify(data.resultCode) ?? '');
    }).catch((err: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG,
        `Failed to start ability for result. Code is ${err.code}, message is ${err.message}`);
    });
  }
  testStartAbilityParametersRouter(): void {
    this.context.startAbility(this.wantInfo).then(() => {
      hilog.info(DOMAIN_NUMBER, TAG, 'startAbility success.');
    }).catch((error: BusinessError) => {
      hilog.error(DOMAIN_NUMBER, TAG, 'startAbility failed.');
    });
  }
}

3.3 目标UIAbility冷启动

目标UIAbility冷启动时,在目标UIAbility的onCreate()生命周期回调中,接收调用方传过来的参数。然后在目标UIAbility的onWindowStageCreate()生命周期回调中,解析调用方传递过来的want参数,获取到需要加载的页面信息url,传入windowStage.loadContent()方法。


import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

const TAG: string = '[FuncAbilityA]';
const DOMAIN_NUMBER: number = 0x0000;
export default class FuncAbilityA extends UIAbility {
  funcAbilityWant: Want | undefined = undefined
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 接收调用方UIAbility传过来的参数
     this.funcAbilityWant = want;
    let info = this.funcAbilityWant?.parameters?.info;
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', `Ability onCreate 接收到的参数 info = ${info}`);
  }

  onDestroy(): void {
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');

    let url: string = 'pages/useuiability/Page_FuncAbilityA';
    if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'SecondFuncA') {
      url = 'pages/useuiability/SecondFuncA';
    }
    windowStage.loadContent(url, (err) => {
      if (err.code) {
        hilog.error(DOMAIN_NUMBER, TAG, 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onBackground');
  }
}

3.4 目标UIAbility热启动

在应用开发中,会遇到目标UIAbility实例之前已经启动过的场景,这时再次启动目标UIAbility时,不会重新走初始化逻辑,只会直接触发onNewWant()生命周期方法。为了实现跳转到指定页面,需要在onNewWant()中解析参数进行处理。

例如短信应用和联系人应用配合使用的场景。

  1. 用户先打开短信应用,短信应用的UIAbility实例启动,显示短信应用的主页。
  2. 用户将设备回到桌面界面,短信应用进入后台运行状态。
  3. 用户打开联系人应用,找到联系人张三。
  4. 用户点击联系人张三的短信按钮,会重新启动短信应用的UIAbility实例。
  5. 由于短信应用的UIAbility实例已经启动过了,此时会触发该UIAbility的onNewWant()回调,而不会再走onCreate()和onWindowStageCreate()等初始化逻辑。

目标UIAbility热启动流程图
在这里插入图片描述

1.冷启动短信应用的UIAbility实例时,在onWindowStageCreate()生命周期回调中,通过调用getUIContext()接口获取UI上下文实例UIContext对象。

// UIAbility组件间交互(设备内)https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497122909477

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

const TAG: string = '[FuncAbilityA]';
const DOMAIN_NUMBER: number = 0x0000;
export default class FuncAbilityA extends UIAbility {
  funcAbilityWant: Want | undefined = undefined
  uiContext: UIContext | undefined = undefined;
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 接收调用方UIAbility传过来的参数
     this.funcAbilityWant = want;
    let info = this.funcAbilityWant?.parameters?.info;
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', `Ability onCreate 接收到的参数 info = ${info}`);
  }

  onDestroy(): void {
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');
    // 目标UIAbility冷启动
    // 目标UIAbility冷启动时,在目标UIAbility的onCreate()生命周期回调中,接收调用方传过来的参数。
    // 然后在目标UIAbility的onWindowStageCreate()生命周期回调中,解析调用方传递过来的want参数,获取到需要加载的页面信息url,传入windowStage.loadContent()方法。

    let url: string = 'pages/useuiability/Page_FuncAbilityA';
    if (this.funcAbilityWant?.parameters?.router && this.funcAbilityWant.parameters.router === 'SecondFuncA') {
      url = 'pages/useuiability/SecondFuncA';
    }
    windowStage.loadContent(url, (err) => {
      if (err.code) {
        hilog.error(DOMAIN_NUMBER, TAG, 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }

      //冷启动短信应用的UIAbility实例时,在onWindowStageCreate()生命周期回调中,通过调用getUIContext()接口获取UI上下文实例UIContext对象。
      let windowClass: window.Window
      windowStage.getMainWindow((err, data) =>{
        if (err.code) {
          hilog.error(DOMAIN_NUMBER, TAG, `Failed to obtain the main window. Code is ${err.code}, message is ${err.message}`);
          return;
        }
        windowClass = data;
        this.uiContext = windowClass.getUIContext();
      })

      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onBackground');
  }
}

2.在短信应用UIAbility的onNewWant()回调中解析调用方传递过来的want参数,通过调用UIContext中的getRouter()方法获取Router对象,并进行指定页面的跳转。此时再次启动该短信应用的UIAbility实例时,即可跳转到该短信应用的UIAbility实例的指定页面。

import { AbilityConstant, Want, UIAbility } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import type { Router, UIContext } from '@kit.ArkUI';
import type { BusinessError } from '@kit.BasicServicesKit';

const DOMAIN_NUMBER: number = 0xFF00;
const TAG: string = '[EntryAbility]';

export default class EntryAbility extends UIAbility {
  funcAbilityWant: Want | undefined = undefined;
  uiContext: UIContext | undefined = undefined;
  // ...
  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    if (want?.parameters?.router && want.parameters.router === 'funcA') {
      let funcAUrl = 'pages/Page_HotStartUp';
      if (this.uiContext) {
        let router: Router = this.uiContext.getRouter();
        router.pushUrl({
          url: funcAUrl
        }).catch((err: BusinessError) => {
          hilog.error(DOMAIN_NUMBER, TAG, `Failed to push url. Code is ${err.code}, message is ${err.message}`);
        });
      }
    }
  }
}

说明
当被调用方UIAbility组件启动模式设置为multiton启动模式时,每次启动都会创建一个新的实例,那么onNewWant()回调就不会被用到。

标签:info,DOMAIN,UIAbility,NUMBER,HarmonyOS,TAG,hilog,组件
From: https://blog.csdn.net/ChinaDragon10/article/details/143822572

相关文章

  • HarmonyOS Next 网络加速进阶:优化策略与应用实践
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在上一篇博客中,我们已经初步......
  • HarmonyOS Next 网络加速入门:基础功能全解析
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在当今数字化时代,网络已经成......
  • HarmonyOS Next 网络加速实战:社交应用网络优化全攻略
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在当今数字化时代,社交应用已......
  • HarmonyOS Next 网络加速实战:打造极致网络体验
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在移动应用的世界里,网络体验......
  • HarmonyOS Next 助力在线教育:网络优化实战案例
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在线教育在当今社会中发挥着......
  • HarmonyOS4+NEXT星河版入门与项目实战--------TypeScript语法(循环控制与函数方法)
    文章目录1、循环控制1、for循环与while循环2、数组快捷迭代方法2、函数1、function关键字2、可选参数3、默认参数4、匿名函数5、函数表达式6、结合使用7、函数声明案例1、循环控制1、for循环与while循环2、数组快捷迭代方法数组除了使用常规的for循环......
  • HarmonyOS4+NEXT星河版入门与项目实战--------TypeScript语法(变量声明与条件控制)
    文章目录1、变量声明1、格式与案例2、在线体验TypeScript2、条件控制1、if-else条件控制switch条件控制1、变量声明1、格式与案例TypeScript常见变量主要有string字符串、number数值、boolen布尔、any不确定类型、Object对象类型、Array数组类型以及......
  • HarmonyOS4+NEXT星河版入门与项目实战--------ArkTs语言与TypeScript语法
    文章目录1、ArkTs语言1、ArkTs特点2、ArkTs与Javascript关系2、TypeScript语法1、ArkTs语言在html的开发中,实现一个页面元素,比如Button,往往包含了以下三种要素:JS、HTML、CSS。JS处理逻辑与响应、HTML用来声明标签生成各种页面控件、CSS用来控制着也控件的样式......
  • 『玩转Streamlit』--图像与媒体组件
    Streamlit中的图像与媒体组件,主要是st.image、st.audio和st.video。它们是专为在StreamlitWeb应用程序中嵌入和展示多媒体内容而设计的,这些组件不仅丰富了应用程序的呈现形式,还极大地提升了用户体验和互动性。1.st.imagest.image函数用于在Streamlit应用程序中展示图像内容,增......
  • 微服务组件【负载均衡】Netflix Ribbon
    微服务组件【负载均衡】NetflixRibbonNetflixRibbon**RestTemplate:负载均衡拦截**HttpAccessor#createRequestInterceptingRequestExecution#executeRibbon负载均衡LoadBalancerClientILoadBalancerIRuleServer博主默语带您GotoNewWorld.✍个人主页......