HarmonyOS App后台切前台,为什么先走了当前页面的onPageShow,再执行了onForeGround?

在EntryAbility的onForeGround中,添加了发射事件。

this.context.eventHub.emit('onForeground'); 

在某个页面A的aboutToApear中注册了监听。

aboutToAppear(): void {
  getContext().eventHub.on('onForeground', () => {
  console.log('APP onforeground');
});
}

在A页面的onPageshow中打印了日志。

onPageShow(): void {
  console.log('A onpageshow');
}

在进入A页面后,切后台再切前台,控制台先打印了'A onpageshow'然后打印了'APP onforeground'。期望是能识别出A页面的onPageShow是进入该页面或者返回该页面执行的,还是后台切前台执行的从而走不同的业务逻辑,如:

onPageShow(): void {
  if (后台切前台) {
    //执行业务逻辑1
  } else {
  //执行业务逻辑2
}
}
阅读 476
1 个回答

1.自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。

2.onPageShow()在页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。

3.目前只有onForeground()回调和onBackground()回调可以感知前后台,可以通过在onForeground()和onBackground()中设置参数传递给@Entry页面,当onPageShow回调执行时通过参数判断来确定是否是前后台显示 可以使用AppStorage作为参数传递。

4.Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。

5.onForeground()回调,在UIAbility的UI可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请系统需要的资源,或者重新申请在onBackground()中释放的资源。

6.onBackground()回调,在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。

7.onPageShow和onForeground是两个独立的生命周期方法,它们分别处理页面切换到前台和从后台切回前台的场景。因此,当应用从后台切到前台时,onPageShow会首先被调用,然后是onForeground。

//设置缓存isForeGround,true表示app在前台,false表示app退到后台
onForeground(): void {
  AppStorage.setOrCreate('isForeGround', true);
}
onBackground(): void {
  AppStorage.setOrCreate('isForeGround', false);
}

将应用切换至前台,onPageShow()先于onForeground()调用,感知到AppStorage为false,确认当前状态,应用处于后台,onPageShow()的操作为应用进入前台。当感知到AppStorage为true时,确认当前状态,应用处于前台,onPageShow()的操作为路由过程。

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