HarmonyOS鸿蒙Next中如何实现点击负一屏图标拉起网盘
HarmonyOS鸿蒙Next中如何实现点击负一屏图标拉起网盘 在系统负一屏中一个 widget 图标, 点击之后能唤起网盘进入网盘某个页面, 这个能否通过 deeplinking 实现?
-
针对动态卡片,ArkTS卡片中提供了postCardAction接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。
-
针对静态卡片,ArkTS卡片提供了FormLink用于卡片内部和提供方应用间的交互。
- 在卡片内触发相应的事件拉起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图标直接唤起网盘应用并跳转指定页面。具体实现方案如下:
- 首先需要在网盘应用的config.json中配置uriScheme:
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ts",
"uri": "clouddrive://"
}
]
- 在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}`);
}
- 网盘应用需要在EntryAbility的onCreate中处理传入的uri:
onCreate(want: Want) {
if (want.uri) {
// 解析uri跳转到对应页面
let path = want.uri.replace('clouddrive://', '');
// 根据path跳转不同页面
}
}
注意事项:
- 需要确保网盘应用已安装且uriScheme配置正确
- 可以在uri中携带参数实现更精确的页面定位
- 建议在Widget中增加应用是否安装的检测逻辑
这种方式相比传统Intent方式更加简洁,且能实现精准页面跳转。