文档管理中心
指南应用框架Ability Kit(程序框架服务)应用间跳转拉起指定类型的应用拉起航班类应用(startAbilityByType)

拉起航班类应用(startAbilityByType)

本章节介绍如何拉起航班类应用扩展面板。

例如,在行程安排类App中,当用户记录了某次行程的航班号,应用能够识别航班号信息并提供航班动态查询的链接。用户点击链接后,应用将通过调用UIAbilityContext.startAbilityByTypeUIExtensionContentSession.startAbilityByType接口,拉起航班类应用的扩展面板。面板上将展示设备上所有支持航班查询的应用,供用户选择并跳转至所需应用。

航班类应用扩展面板参数说明

startAbilityByType接口中type字段为flight,支持按航班号查询、按起降地查询两种意图场景,对应的wantParam参数如下:

  • 按航班号查询场景

    展开
    参数名 类型 必填 说明
    sceneType number 意图场景,表明本次请求对应的操作意图。默认为1,按航班号查询场景填1或不填。
    flightNo string 航班号,航司二位代码+数字。
    departureDate string 航班出发时间:YYYY-MM-DD。
  • 按起降地查询场景

    展开
    参数名 类型 必填 说明
    sceneType number 意图场景,表明本次请求对应的操作意图。按起降地查询场景填2。
    originLocation string 出发地。
    destinationLocation string 目的地。
    departureDate string 航班出发时间:YYYY-MM-DD。

拉起方开发步骤

  1. 导入相关模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { common } from '@kit.AbilityKit';
  2. 构造接口参数并调用startAbilityByType接口。

    收起
    自动换行
    深色代码主题
    复制
    1. @Entry
    2. @Component
    3. struct Index {
    4. @State hideAbility: string = 'hideAbility'
    5. build() {
    6. Row() {
    7. Column() {
    8. Text(this.hideAbility)
    9. .fontSize(30)
    10. .fontWeight(FontWeight.Bold)
    11. .onClick(() => {
    12. let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    13. let wantParam: Record<string, Object> = {
    14. 'sceneType': 1,
    15. 'flightNo': 'ZH1509',
    16. 'departureDate': '2024-10-01'
    17. };
    18. let abilityStartCallback: common.AbilityStartCallback = {
    19. onError: (code: number, name: string, message: string) => {
    20. console.error(`onError code ${code} name: ${name} message: ${message}`);
    21. },
    22. onResult: (result) => {
    23. console.info(`onResult result: ${JSON.stringify(result)}`);
    24. }
    25. }
    26. context.startAbilityByType("flight", wantParam, abilityStartCallback,
    27. (err) => {
    28. if (err) {
    29. console.error(`startAbilityByType fail, err: ${JSON.stringify(err)}`);
    30. } else {
    31. console.info(`success`);
    32. }
    33. });
    34. });
    35. }
    36. .width('100%')
    37. }
    38. .height('100%')
    39. }
    40. }

    效果示例图:

目标方开发步骤

  1. 在module.json5中配置uris

    1. 设置linkFeature属性以声明当前应用支持的特性功能,从而系统可以从设备已安装应用中找到当前支持该特性的应用,取值范围如下:
      展开
      取值 含义
      QueryByFlightNo 声明应用支持按航班号查询航班。
      QueryByLocation 声明应用支持按起降地查询航班。
    2. 设置scheme、host、port、path/pathStartWith属性,与Want中URI相匹配,以便区分不同功能。
      收起
      自动换行
      深色代码主题
      复制
      1. {
      2. "abilities": [
      3. {
      4. "skills": [
      5. {
      6. "uris": [
      7. {
      8. "scheme": "flight",
      9. "host": "queryByFlightNo",
      10. "path": "",
      11. "linkFeature": "QueryByFlightNo"
      12. },
      13. {
      14. "scheme": "flight",
      15. "host": "queryByLocation",
      16. "path": "",
      17. "linkFeature": "QueryByLocation"
      18. }
      19. ]
      20. }
      21. ]
      22. }
      23. ]
      24. }
  2. 解析参数并做对应处理。

    收起
    自动换行
    深色代码主题
    复制
    1. UIAbility.onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void

    在参数want.uri中会携带目标方配置的linkFeature对应的uri。

    在参数want.parameters中会携带Caller方传入的参数,不同场景参数如下所示

    • 按航班号查询场景

      展开
      参数名 类型 必填 说明
      flightNo string 航班号,航司二位代码+数字。
      departureDate string 航班出发时间:YYYY-MM-DD。不填时,Target可按当天处理。
    • 按起降地查询场景

      展开
      参数名 类型 必填 说明
      originLocation string 出发地。
      destinationLocation string 目的地。
      departureDate string 航班出发时间:YYYY-MM-DD。不填时,Target可按当天处理。

    应用可根据linkFeature中定义的特性功能,比如按航班号查询和按起降地查询,结合接收到的uri和参数开发不同的样式页面。

完整示例:

收起
自动换行
深色代码主题
复制
  1. import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
  2. import { hilog } from '@kit.PerformanceAnalysisKit';
  3. import { window } from '@kit.ArkUI';
  4. const TAG = 'EntryAbility';
  5. export default class EntryAbility extends UIAbility {
  6. windowStage: window.WindowStage | null = null;
  7. uri?: string;
  8. flightNo?: string;
  9. departureDate?: string;
  10. originLocation?: string;
  11. destinationLocation?: string;
  12. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  13. hilog.info(0x0000, TAG, `onCreate, want=${JSON.stringify(want)}`);
  14. super.onCreate(want, launchParam);
  15. this.parseWant(want);
  16. }
  17. onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  18. hilog.info(0x0000, TAG, `onNewWant, want=${JSON.stringify(want)}`);
  19. super.onNewWant(want, launchParam);
  20. this.parseWant(want);
  21. if (!this.windowStage) {
  22. hilog.error(0x0000, TAG, 'windowStage is null');
  23. this.context.terminateSelf();
  24. return;
  25. }
  26. this.loadPage(this.windowStage);
  27. }
  28. private parseWant(want: Want): void {
  29. this.uri = want.uri as string | undefined;
  30. this.flightNo = want.parameters?.flightNo as string | undefined;
  31. this.departureDate = want.parameters?.departureDate as string | undefined;
  32. this.originLocation = want.parameters?.originLocation as string | undefined;
  33. this.destinationLocation = want.parameters?.destinationLocation as string | undefined;
  34. }
  35. private loadPage(windowStage: window.WindowStage): void {
  36. hilog.info(0x0000, TAG, `loadPage, uri=${this.uri}`);
  37. if (this.uri === 'flight://queryByFlightNo') {
  38. // 构建按航班号查询场景参数
  39. const storage: LocalStorage = new LocalStorage({
  40. "flightNo": this.flightNo,
  41. "departureDate": this.departureDate
  42. } as Record<string, Object>);
  43. // 拉起按航班号查询页面
  44. windowStage.loadContent('pages/QueryByFlightNoPage', storage)
  45. } else if (this.uri === 'flight://queryByLocation') {
  46. // 构建按起降地查询场景参数
  47. const storage: LocalStorage = new LocalStorage({
  48. "originLocation": this.originLocation,
  49. "destinationLocation": this.destinationLocation,
  50. "departureDate": this.departureDate
  51. } as Record<string, Object>);
  52. // 拉起按起降地查询页面
  53. windowStage.loadContent('pages/QueryByLocationPage', storage)
  54. } else {
  55. // 默认拉起首页
  56. windowStage.loadContent('pages/Index', (err) => {
  57. if (err.code) {
  58. hilog.error(0x0000, TAG, 'Failed to load the content. Cause: %{public}s',
  59. JSON.stringify(err) ?? '');
  60. return;
  61. }
  62. hilog.info(0x0000, TAG, 'Succeeded in loading the content.');
  63. });
  64. }
  65. }
  66. onDestroy(): void {
  67. hilog.info(0x0000, TAG, `onDestroy`);
  68. }
  69. onWindowStageCreate(windowStage: window.WindowStage): void {
  70. hilog.info(0x0000, TAG, `onWindowStageCreate`);
  71. this.windowStage = windowStage;
  72. this.loadPage(this.windowStage);
  73. }
  74. onWindowStageDestroy(): void {
  75. hilog.info(0x0000, TAG, '%{public}s', 'Ability onWindowStageDestroy');
  76. }
  77. onForeground(): void {
  78. hilog.info(0x0000, TAG, '%{public}s', 'Ability onForeground');
  79. }
  80. onBackground(): void {
  81. hilog.info(0x0000, TAG, '%{public}s', 'Ability onBackground');
  82. }
  83. }
在 指南 中进行搜索
请输入您想要搜索的关键词