HarmonyOS 鸿蒙Next 关于在热启动跳转的时候,出现两个页面的问题
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
知道问题出在哪里了,我就想知道,写开发文档的人就不能写的全一点,又要熟悉router,还要熟悉Android,还要熟悉TS,就一点不考虑刚入门其中一门或者两门的人吗
更多关于HarmonyOS 鸿蒙Next 关于在热启动跳转的时候,出现两个页面的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
问题怎么解决可以麻烦分享下不,
在HarmonyOS鸿蒙Next中,热启动跳转时出现两个页面的问题,可能是由于页面生命周期管理不当或页面栈未正确清理导致的。在鸿蒙系统中,页面跳转时,系统会将当前页面压入页面栈,并在跳转后显示新页面。如果页面栈未正确清理,可能会导致旧页面仍然存在,从而出现两个页面同时显示的情况。
具体原因可能包括:
- 页面栈未正确清理:在跳转前未调用
present
或terminate
等方法清理当前页面,导致旧页面仍然保留在页面栈中。 - 页面生命周期管理不当:在页面跳转时,未正确处理
onActive
、onInactive
等生命周期方法,导致页面状态异常。 - 异步操作未完成:在跳转时,某些异步操作(如网络请求)未完成,导致页面未及时销毁。
解决方法包括:
- 确保页面栈正确清理:在跳转前调用
present
或terminate
等方法,确保旧页面被正确移除。 - 正确处理页面生命周期:在页面跳转时,确保
onActive
、onInactive
等生命周期方法被正确调用,以管理页面状态。 - 确保异步操作完成:在跳转前,确保所有异步操作已完成,避免页面未及时销毁。
通过以上方法,可以有效解决热启动跳转时出现两个页面的问题。
在HarmonyOS鸿蒙Next中,热启动跳转时出现两个页面,可能是由于页面生命周期管理不当或跳转逻辑错误导致的。建议检查以下两点:
-
确保在跳转前正确调用
finish()
方法关闭当前页面; -
检查跳转逻辑,避免重复调用
startAbility()
或startActivity()
。
此外,确保页面栈管理正确,避免页面重叠。调试时可以使用日志工具跟踪页面生命周期,定位问题。