鸿蒙应用开发中的页面跳转,目前支持Ability的跳转,Page之间跳转,小组件、通知点击跳转。
多会一门技术,多一条路,少一分焦虑。——城西往事
1.直接调用startAbility(want)方式
let detailWant = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'om.example.myapplication',
abilityName: 'NewsDetailAbility',
moduleName: 'entry', // moduleName非必选
// parameters: { // 自定义信息
// key: "ddf1132",
// },
}
contextController.startAbility(detailWant).then(()=>{
console.info('Succeeded in starting ability.');
}).catch((err:Error)=>{
console.error(`Failed to start ability. message is ${err.message}`);
})
如果需要在自定义组件Component中打开一个Ability界面,除了上述代码处理外,需要在main_pages.json中检查页面路由配置有没遗漏,才能正常跳转。这块鸿蒙开发比较松散,如果是添加页面的时候自动在main_pages.json中就YYDS了。
{
"src": [
"pages/MainPage",
"pages/Index",
"pages/DetailPage"
]
}
接收参数是在这里:
- 首次启动
import UIAbility from '@ohos.app.ability.UIAbility'
import Window from '@ohos.window'
export default class FuncAbility extends UIAbility {
funcAbilityWant;
onCreate(want, launchParam) {
// 接收调用方UIAbility传过来的参数
this.funcAbilityWant = want;
}
onWindowStageCreate(windowStage: Window.WindowStage) {
// Main window is created, set main page for this ability
let url = 'pages/Index';
if (this.funcAbilityWant?.parameters?.router) {
if (this.funcAbilityWant.parameters.key === 'ddf1132') {
url = 'pages/Second';
}
}
windowStage.loadContent(url, (err, data) => {
// ...
});
}
}
- 非首次启动:
import UIAbility from '@ohos.app.ability.UIAbility'
export default class FuncAbility extends UIAbility {
onNewWant(want, launchParam) {
// 接收调用方UIAbility传过来的参数
globalThis.funcAbilityWant = want;
// ...
}
}
如何获取:contextController.startAbility 中的contextController?
-
直接在自定义组件中获取并转换getContext() as common.UIAbilityContext
-
通过eventHub方式: 在要打开组件的Ability中订阅eventHub。
this.context.eventHub.on("getAbilityData",(data)=>{ let detailWant = { deviceId: '', // deviceId为空表示本设备 bundleName: 'om.example.myapplication', abilityName: 'NewsDetailAbility', moduleName: 'entry', // moduleName非必选 // parameters: { // 自定义信息 // instanceKey: "ddf1132", // }, } data.context = that.context data.launchWant = detailWant }) }在要打开页面的组件中触发上述回调:
let data = { context:null, launchWant:null } getContext().eventHub.emit("getAbilityData",data)
2.通过router系统跨模块组件切换页面:
import router from '@ohos.router';
router.pushUrl({
url:'pages/Detail',
params:{
key:"from home"
}
},router.RouterMode.Single,(err)=>{
console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
return;
});
注:url怎么填,参考main_pages.json
3.通过postCardAction方式:(只能在卡片之间跳转,卡片类似于安卓ios中的小组件)
postCardAction(this,{
action:'router',
abilityName: 'DetailAbility',
params:{
}
});