如何启动Ability后跳转到指定目标页面?

场景描述

在App实际开发过程中,常常会遇到需要跳转到其他功能模块的某个页面中的情况。在该场景下,依据不同的业务处理结果会跳转到不同的页面来展示,这样用户体验更好。该功能场景在HarmonyOS中该如何实现呢?

阅读 691
1 个回答

知识准备

1、应用级变量的状态管理

2、Ability生命周期

以MainAbility中的某个页面index为例,来启动某个Ability,例如CommonAbility,并跳转到指定页面commonPage1。以此为例来演示如何实现该场景。

场景一:当CommonAbility未启动时

当该Ability未启动时,可以按照如下方式来实现:

步骤1:在MainAbility创建时将上下文context保存到应用中。

export default class MainAbility extends Ability {
    onCreate(want, launchParam) {
      AppStorage.SetOrCreate("ABILITY_CONTEXT",this.context);
    }
}

步骤2:在MainAbility的index页面中启动CommonAbility,并将需要跳转的页面通过want中的uri参数指定。

startAbility(){
  let context = AppStorage.Get("ABILITY_CONTEXT") as context.AbilityContext;
  let want = {
    deviceId:"",//跨设备启动时传入,同设备时不需要传入
    bundleName:"com.example.startabilitytopage",//指定启动Ability所在的Hap包
    abilityName:"CommonAbility",//指定启动的Ability
    uri:"pages/commonPage1"//指定跳转页面
  }
  context.startAbility(want).then(()=>{
    console.info("start CommonAbility success")
  }).catch((err)=>{
    console.info("start CommonAbility failed,error is : "+err)
  })
}

步骤3:在指定启动的CommonAbility中的onCreate()生命周期函数中将传递过来的参数信息保存下来。

export default class CommonAbility extends Ability {
    onCreate(want, launchParam) {
        AppStorage.SetOrCreate("WANT_PAGE",want)
    }
}

步骤4:在指定启动的CommonAbility中窗口创建时,将保存的页面参数取出,并加载该页面。

export default class CommonAbility extends Ability {
    
    onWindowStageCreate(windowStage: Window.WindowStage) {
        // Main window is created, set main page for this ability
        let firstPage = "pages/index";//设置默认加载页面
        let want = AppStorage.Get("WANT_PAGE") as Want;
        if(want.hasOwnProperty("uri")){
            firstPage = want.uri;//加载指定页面
        }
        windowStage.loadContent(firstPage, (err, data) => {
            if (err.code) {
                hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.ERROR);
                hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
                return;
            }
            hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO);
            hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
        });
    }
}

场景二:当CommonAbility已经启动时

步骤1:同场共享包HSP内容访问景一的步骤1。

步骤2:同场景一的步骤2。

步骤3:由于CommonAbility已经启动,需要在onNewWant()回调函数中保存传递过来的参数信息。

export default class CommonAbility extends Ability {
 
    onNewWant(want,launchParams){
        AppStorage.SetOrCreate("WANT_PAGE",want)
    }
} 

步骤4:同场景一的步骤4。

测试结果如下:

点击启动CommonAbility后,跳转到指定页面commonPage1

查看后台Ability情况如下:

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进