HarmonyOS鸿蒙Next中如何实现点击负一屏图标拉起网盘

HarmonyOS鸿蒙Next中如何实现点击负一屏图标拉起网盘 在系统负一屏中一个 widget 图标, 点击之后能唤起网盘进入网盘某个页面, 这个能否通过 deeplinking 实现?

3 回复
  • 针对动态卡片,ArkTS卡片中提供了postCardAction接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。

  • 针对静态卡片,ArkTS卡片提供了FormLink用于卡片内部和提供方应用间的交互。

  1. 在卡片内触发相应的事件拉起UIAbility。
  • 动态卡片中调用postCardAction向指定UIAbility发送router事件,参考如下:
@Entry
@Component
struct WidgetCard {
  build() {
    Column () {
      Button('Button')
        .onClick(() => {
          postCardAction(this, {
            action: 'router',
            abilityName: 'EntryAbility',
            params: { targetPage: 'PageB' },
          });
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

静态卡片调用FormLink向指定UIAbility发送router事件,参考如下:

@Entry
@Component
struct WidgetCard {
  build() {
    Column () {
      FormLink({
        action: 'router',
        abilityName: 'EntryAbility',
        params: {
          targetPage: 'PageB'
        }
      }) {
        Button('Button')
      }
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

在UIAbility中接收router事件并获取参数,根据传递的params不同,选择拉起不同的页面,参考如下:

// EntryAbility.ets
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
export default class EntryAbility extends UIAbility {
  private selectPage: string = '';
  private currentWindowStage: window.WindowStage | null = null;
  // 获取router事件中传递的targetPage参数
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    if (want.parameters !== undefined) {
      let params: Record<string, string> = JSON.parse(JSON.stringify(want.parameters));
      this.selectPage = params.targetPage;
    }
  }
  // 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调
  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    if (want.parameters?.params !== undefined) {
      let params: Record<string, string> = JSON.parse(JSON.stringify(want.parameters));
      this.selectPage = JSON.parse(params.params).message
    }
    if (this.currentWindowStage !== null) {
      this.onWindowStageCreate(this.currentWindowStage);
    }
  }
  onWindowStageCreate(windowStage: window.WindowStage): void {
    let targetPage: string='pages/Index';
    if(this.selectPage=='PageB'){
      targetPage='pages/PageB'
    }
    if (this.currentWindowStage === null) {
      this.currentWindowStage = windowStage;
    }
    windowStage.loadContent(targetPage, (err) => {
      if (err.code) {
        return;
      }
    });
  }
}

更多关于HarmonyOS鸿蒙Next中如何实现点击负一屏图标拉起网盘的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,可以通过Intent和Ability的机制实现点击负一屏图标拉起网盘。首先,在config.json中配置网盘应用的Ability信息,定义Intent的action和uri。然后,在负一屏的卡片开发中,使用startAbility方法,通过指定Intent的action和uri来启动网盘应用。具体代码示例如下:

let intent = {
    bundleName: 'com.example.clouddisk',
    abilityName: 'com.example.clouddisk.MainAbility',
    action: 'action.view',
    uri: 'clouddisk://open'
};
this.context.startAbility(intent);

确保网盘应用已安装且配置正确。

在HarmonyOS Next中,可以通过Deep Linking实现从负一屏Widget图标直接唤起网盘应用并跳转指定页面。具体实现方案如下:

  1. 首先需要在网盘应用的config.json中配置uriScheme:
"abilities": [
  {
    "name": "EntryAbility",
    "srcEntry": "./ets/entryability/EntryAbility.ts",
    "uri": "clouddrive://"
  }
]
  1. 在Widget的点击事件中调用startAbility:
let want = {
  uri: 'clouddrive://path/to/page'
};
try {
  await context.startAbility(want);
} catch (err) {
  console.error(`Failed to start ability. Code: ${err.code}, message: ${err.message}`);
}
  1. 网盘应用需要在EntryAbility的onCreate中处理传入的uri:
onCreate(want: Want) {
  if (want.uri) {
    // 解析uri跳转到对应页面
    let path = want.uri.replace('clouddrive://', '');
    // 根据path跳转不同页面
  }
}

注意事项:

  • 需要确保网盘应用已安装且uriScheme配置正确
  • 可以在uri中携带参数实现更精确的页面定位
  • 建议在Widget中增加应用是否安装的检测逻辑

这种方式相比传统Intent方式更加简洁,且能实现精准页面跳转。

回到顶部