HarmonyOS 鸿蒙Next中页面如何感知进入后台还是路由跳转
HarmonyOS 鸿蒙Next中页面如何感知进入后台还是路由跳转 我有一个音频,在进入后台我申请长时任务继续播放,跳转其他页面暂停播放。
我改如何区分开这两种情况,hidden这两种都会触发。
进入后台会走UIAbility的onBackground,路由跳转不会走UIAbility的onBackground
更多关于HarmonyOS 鸿蒙Next中页面如何感知进入后台还是路由跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
如果只要涉及页面切换都要停止播放的话使用 uiObserver.on('navDestinationSwitch')
来监听页面的跳转里面的参数是可以判断从哪儿到哪儿
切换到后台就是用 onBackground
和 onForeground
来处理
具体的实现看博主的具体场景来了,打点也是一个很好的想法
首先 在 UIAbility 中监听应用前后台变化
// EntryAbility.ts
import { UIAbility } from '@kit.AbilityKit';
import { AppStorage } from '@kit.ArkData';
export default class EntryAbility extends UIAbility {
onForeground(): void {
// 应用回到前台时设置全局标记
AppStorage.SetOrCreate<boolean>('isAppInForeground', true);
}
onBackground(): void {
// 应用进入后台时设置全局标记
AppStorage.SetOrCreate<boolean>('isAppInForeground', false);
// 进入后台时申请长时任务(需添加权限和配置)
this.context.startBackgroundRunning(...);
}
}
然后 在页面中区分路由跳转与后台切换
// YourPage.ets
import { AppStorage } from '@kit.ArkData';
@Entry
@Component
struct AudioPage {
@State isAppForeground: boolean = AppStorage.Get('isAppInForeground');
onPageShow() {
if (this.isAppForeground) {
// 从路由返回或首次进入页面时触发
console.log('页面显示:路由跳转返回');
} else {
// 应用从后台回到前台时触发
console.log('页面显示:应用回到前台');
this.resumeAudio();
}
AppStorage.SetOrCreate<boolean>('isAppInForeground', true);
}
onPageHide() {
if (AppStorage.Get('isAppInForeground')) {
// 路由跳转离开页面时触发
console.log('页面隐藏:路由跳转离开');
this.pauseAudio();
} else {
// 应用进入后台时触发
console.log('页面隐藏:应用进入后台');
}
}
pauseAudio() {
// 暂停音频逻辑
}
resumeAudio() {
// 恢复音频逻辑
}
}
一楼的方式可行,在UIability的onBackgrounde()中进行申请继续长时任务。
在页面的生命周期onwilldisappear中取消长时任务
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-page-custom-components-lifecycle
至于hidden两种情况都触发,这个是因为在应用切到后台时,会先触发页面的显示隐藏,
可以通过多个状态量联合标记进行判断。
跳转可以监听跳转的事件,比如如果用的是navigation,则可以在他的生命周期中处理:
页面使用window.getLastWindow(this.context).on()
去判断进入后台跟返回前台,至于说前台跳转,直接在跳转方法里面添加暂停播放的不就可以?
import { window } from '@kit.ArkUI';
@Component
struct TextPage{
aboutToAppear():void{
let win = window.getLastWindow(this.context);
win.on('windowEvent', (event) => { if (event === window.WindowEvent.HIDE)
{ console.log("页面进入后台"); // 触发自定义逻辑(如保存状态) }
else if (event === window.WindowEvent.SHOW)
{ console.log("页面回到前台"); } });
}
}
在HarmonyOS NEXT中,页面可通过onPageHide
和onPageShow
生命周期回调感知状态变化。当页面进入后台(如返回桌面)时触发onPageHide
;路由跳转时若目标页覆盖当前页也会触发该回调。可通过routerState
模块的isActive
方法判断页面是否仍处于路由栈中,结合AbilityContext
的getAbilityState
区分后台状态与路由跳转场景。具体状态判断需在回调中自行实现逻辑。
在HarmonyOS Next中,可以通过以下方式区分应用进入后台和页面路由跳转:
- 对于进入后台的情况:
- 监听
onBackground
生命周期回调 - 适合处理长时任务申请
- 对于页面跳转:
- 使用
router
模块的pushUrl
/replaceUrl`等方法时,在跳转前处理暂停逻辑 - 或在目标页面的
aboutToAppear
中处理
- 具体实现建议:
// 后台状态监听
appTask.on('background', () => {
// 申请长时任务继续播放
});
// 页面跳转时
router.pushUrl({
url: 'pages/target',
params: {
shouldPauseAudio: true
}
});
// 目标页面
aboutToAppear() {
if (this.params?.shouldPauseAudio) {
// 暂停音频
}
}
注意:hidden
事件确实会同时触发这两种情况,所以需要结合具体业务逻辑进行区分处理。