HarmonyOS 鸿蒙Next中页面如何感知进入后台还是路由跳转

HarmonyOS 鸿蒙Next中页面如何感知进入后台还是路由跳转 我有一个音频,在进入后台我申请长时任务继续播放,跳转其他页面暂停播放。

我改如何区分开这两种情况,hidden这两种都会触发。

8 回复

进入后台会走UIAbility的onBackground,路由跳转不会走UIAbility的onBackground

更多关于HarmonyOS 鸿蒙Next中页面如何感知进入后台还是路由跳转的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


如果只要涉及页面切换都要停止播放的话使用 uiObserver.on('navDestinationSwitch') 来监听页面的跳转里面的参数是可以判断从哪儿到哪儿

参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-arkui-observer#uiobserveronnavdestinationswitch12

切换到后台就是用 onBackgroundonForeground 来处理

具体的实现看博主的具体场景来了,打点也是一个很好的想法

首先 在 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-navigation-navigation#%E9%A1%B5%E9%9D%A2%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-page-custom-components-lifecycle

至于hidden两种情况都触发,这个是因为在应用切到后台时,会先触发页面的显示隐藏,

cke_16783.png

cke_17572.png

可以通过多个状态量联合标记进行判断。

或者其他方式https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navdestination#onresult15

cke_33780.png

跳转可以监听跳转的事件,比如如果用的是navigation,则可以在他的生命周期中处理:

image.png

页面使用window.getLastWindow(this.context).on()去判断进入后台跟返回前台,至于说前台跳转,直接在跳转方法里面添加暂停播放的不就可以?

文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-window-window#onwindowevent10

import { window } from '@kit.ArkUI';

@Component
struct TextPage{
aboutToAppear():void{
let win = window.getLastWindow(this.context); 
win.on('windowEvent', (event) =&gt; { if (event === window.WindowEvent.HIDE) 
{ console.log("页面进入后台"); // 触发自定义逻辑(如保存状态) } 
else if (event === window.WindowEvent.SHOW) 
{ console.log("页面回到前台"); } });
}
}

在HarmonyOS NEXT中,页面可通过onPageHideonPageShow生命周期回调感知状态变化。当页面进入后台(如返回桌面)时触发onPageHide;路由跳转时若目标页覆盖当前页也会触发该回调。可通过routerState模块的isActive方法判断页面是否仍处于路由栈中,结合AbilityContextgetAbilityState区分后台状态与路由跳转场景。具体状态判断需在回调中自行实现逻辑。

在HarmonyOS Next中,可以通过以下方式区分应用进入后台和页面路由跳转:

  1. 对于进入后台的情况:
  • 监听onBackground生命周期回调
  • 适合处理长时任务申请
  1. 对于页面跳转:
  • 使用router模块的pushUrl/replaceUrl`等方法时,在跳转前处理暂停逻辑
  • 或在目标页面的aboutToAppear中处理
  1. 具体实现建议:
// 后台状态监听
appTask.on('background', () => {
  // 申请长时任务继续播放
});

// 页面跳转时
router.pushUrl({
  url: 'pages/target',
  params: {
    shouldPauseAudio: true
  }
});

// 目标页面
aboutToAppear() {
  if (this.params?.shouldPauseAudio) {
    // 暂停音频
  }
}

注意:hidden事件确实会同时触发这两种情况,所以需要结合具体业务逻辑进行区分处理。

回到顶部