鸿蒙应用开发中的页面跳转方式总结

1,469 阅读1分钟

鸿蒙应用开发中的页面跳转,目前支持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:{

  }
});