HarmonyOS 鸿蒙Next 关于在热启动跳转的时候,出现两个页面的问题

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 关于在热启动跳转的时候,出现两个页面的问题

1.代码

// AbilityB
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { Router, UIContext, window } from '@kit.ArkUI';

export default class ReceiveStartAbilityForTwoComponent extends UIAbility {
  private mWant: Want | undefined
  private uiContent: UIContext | undefined

  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    this.mWant = want
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    let url = 'pages/s14_startAbility/S2_StartAbility'
    if (this.mWant?.parameters?.type === 'S2') {
      url = 'pages/s14_startAbility/S3_StartAbility'
    }
    windowStage.loadContent(url, (error, data) => {
      if (error.code) {
        return
      }
      windowStage.getMainWindow((error, data) => {
        if (error.code) {
          return
        }
        this.uiContent = data.getUIContext()
      })
    })
  }

  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    let url = 'pages/s14_startAbility/S2_StartAbility'
    if (want?.parameters?.type === 'S2') {
      url = 'pages/s14_startAbility/S3_StartAbility'
    }
    if (this.uiContent) {
      const router: Router = this.uiContent.getRouter()
      router.pushUrl({
        url: url
      })
    }
  }
}

//Ability B的页面
@Entry
@Component
struct StartAbilityS3 {

  build() {
    Column () {
      Text('我是第二个页面')
    }
  }
}

@Entry
@Component
struct StartAbilityS2 {

  build() {
    Column () {
      Text('我是第二个页面')
    }
  }
}

// Ability A 的页面
import { common, Want } from '@kit.AbilityKit'

@Entry
@Component
struct StartAbilityS1 {
  private context = getContext(this) as common.UIAbilityContext

  build() {
    Column () {
      Button('跳转第一个页面').onClick((event: ClickEvent) => {
        const want: Want = {
          bundleName: 'com.example.example',
          abilityName: 'ReceiveStartAbilityForTwoComponent',
          parameters: {
            type: 'S1'
          }
        }
        this.context.startAbility(want)
      }).margin(10)

      Button('跳转第二个页面').onClick((event: ClickEvent) => {
        const want: Want = {
          bundleName: 'com.example.example',
          abilityName: 'ReceiveStartAbilityForTwoComponent',
          parameters: {
            type: 'S2'
          }
        }
        this.context.startAbility(want)
      }).margin(10)
    }
  }
}

2. 问题

在第一次点击的时候,能进行正常的跳转,然后按返回键,返回到 AbilityA,再次点击按钮的时候,进入ReceiveStartAbilityForTwoComponent,按返回键,发现 S2 和 S3的页面都出现了,最终显示的是S3,按返回键,显示S2,再按一次返回键才会返回 AbilityA 的页面

3. 环境

DS: DevEco Studio NEXT Developer Beta2
模拟器: harmonyOS next developer Beta2
SDK: 不知道在哪里查看,如果需要我可以找找


更多关于HarmonyOS 鸿蒙Next 关于在热启动跳转的时候,出现两个页面的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

知道问题出在哪里了,我就想知道,写开发文档的人就不能写的全一点,又要熟悉router,还要熟悉Android,还要熟悉TS,就一点不考虑刚入门其中一门或者两门的人吗

更多关于HarmonyOS 鸿蒙Next 关于在热启动跳转的时候,出现两个页面的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


问题怎么解决可以麻烦分享下不,

在HarmonyOS鸿蒙Next中,热启动跳转时出现两个页面的问题,可能是由于页面生命周期管理不当或页面栈未正确清理导致的。在鸿蒙系统中,页面跳转时,系统会将当前页面压入页面栈,并在跳转后显示新页面。如果页面栈未正确清理,可能会导致旧页面仍然存在,从而出现两个页面同时显示的情况。

具体原因可能包括:

  1. 页面栈未正确清理:在跳转前未调用presentterminate等方法清理当前页面,导致旧页面仍然保留在页面栈中。
  2. 页面生命周期管理不当:在页面跳转时,未正确处理onActiveonInactive等生命周期方法,导致页面状态异常。
  3. 异步操作未完成:在跳转时,某些异步操作(如网络请求)未完成,导致页面未及时销毁。

解决方法包括:

  1. 确保页面栈正确清理:在跳转前调用presentterminate等方法,确保旧页面被正确移除。
  2. 正确处理页面生命周期:在页面跳转时,确保onActiveonInactive等生命周期方法被正确调用,以管理页面状态。
  3. 确保异步操作完成:在跳转前,确保所有异步操作已完成,避免页面未及时销毁。

通过以上方法,可以有效解决热启动跳转时出现两个页面的问题。

在HarmonyOS鸿蒙Next中,热启动跳转时出现两个页面,可能是由于页面生命周期管理不当或跳转逻辑错误导致的。建议检查以下两点:

  1. 确保在跳转前正确调用finish()方法关闭当前页面;

  2. 检查跳转逻辑,避免重复调用startAbility()startActivity()

此外,确保页面栈管理正确,避免页面重叠。调试时可以使用日志工具跟踪页面生命周期,定位问题。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!