HarmonyOS鸿蒙Next中退出应用后重新进入页面会在上个页面多停留1-2秒

HarmonyOS鸿蒙Next中退出应用后重新进入页面会在上个页面多停留1-2秒 【问题描述】:应用场景是有个倒计时功能,倒计时60秒之后会重启应用,正常在前台倒计时结束之后会重启应用重启时之后闪一下倒计时页面,如果是在倒计时页面直接杀后台,等待时间进入应用也会正常出现倒计时页面然后停顿1-2秒,本地调试效果很明显,想问下可能是什么原因

【问题现象】:应用不退出调用走的是

this.TimeOut == "1"

应用退出走的是

this.GetTime >= this.UnLockTime

打印日志看是正常的,就是杀后台重新进入会停顿较久

【版本信息】:mate60 6.0.0.112

【复现代码】:

aboutToAppear(): void {

    this.UnLockTime = this.getTimeOut()
    setInterval(() => {
      this.GetTime = systemDateTime.getTime()

      if(this.UnLockTime-this.GetTime <= 10000)
      {
        this.TimeOut = (this.UnLockTime - this.GetTime).toString().substring(0,1)
        //杀后台再进入timeout 结果是空
        console.log('timeout'+this.TimeOut)
        //超过剩余时间 结果是true
        console.log('this.GetTime >= this.UnLockTime'+(this.GetTime >= this.UnLockTime))
        if(this.TimeOut == "1" || this.GetTime >= this.UnLockTime){
          // setTimeout(()=>{
            //存储倒计时状态,做了一个持久化操作
            this.setLocking(!this.is_Locking)
               //重启应用
            appRecovery.restartApp()
          // },777)
        }
      }else {
        this.TimeOut = (this.UnLockTime - this.GetTime).toString().substring(0,2)
      }
    }, 1000);
}

    //锁定持久化
  private setLocking(value: boolean): void {
    const context: common.Context = this.getUIContext().getHostContext() as common.Context

    const option: preferences.Options = { name: 'user_SetLocking_pref' }
    const pref: preferences.Preferences = preferences.getPreferencesSync(context,option)
    pref.putSync('Locking', value)
    pref.flush()
  }

【尝试解决方案】:不确定定时器还是后台杀掉之后需要加载资源导致的,最早是没问题的


更多关于HarmonyOS鸿蒙Next中退出应用后重新进入页面会在上个页面多停留1-2秒的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,应用退出后重新进入时页面多停留1-2秒,通常是由于应用生命周期管理或页面状态恢复机制导致。系统可能保留了页面实例以优化重新启动速度,但恢复过程存在延迟。可检查页面onPageShow生命周期回调是否执行耗时操作,或检查页面状态保存与恢复逻辑是否影响渲染。

更多关于HarmonyOS鸿蒙Next中退出应用后重新进入页面会在上个页面多停留1-2秒的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


根据你提供的代码和描述,问题很可能出在 页面生命周期与定时器管理的冲突 上。具体分析如下:

核心原因分析:

  1. 定时器未清理:在 aboutToAppear 生命周期函数中,你使用 setInterval 启动了一个每秒执行的定时器。当应用被杀后台后重新进入时,aboutToAppear 会再次执行,从而创建了一个新的定时器实例,但旧的定时器(如果应用进程未被完全销毁)可能仍在运行或未被正确清理。多个定时器实例同时运行可能导致状态判断逻辑混乱,引发页面停留。

  2. 状态恢复时机:从后台恢复时,页面需要重新初始化并恢复数据(如 UnLockTime)。如果定时器在数据完全恢复前就开始执行判断逻辑(this.GetTime >= this.UnLockTime),可能因初始值问题导致条件误判,从而触发 restartApp() 重启应用,造成页面闪退后又重新加载,出现视觉上的“停顿”。

  3. 应用重启机制appRecovery.restartApp() 会重启整个应用,这可能涉及页面栈重建和资源重新加载。若重启前定时器仍在运行,重启过程中可能发生异步竞争,导致页面显示延迟。

解决建议:

  • aboutToDisappear 中清理定时器: 在页面离开时(如跳转或应用退后台),务必清除定时器,避免残留定时器干扰。

    private timerId: number | undefined; // 声明定时器ID
    
    aboutToAppear(): void {
      this.UnLockTime = this.getTimeOut();
      this.timerId = setInterval(() => {
        // ... 你的逻辑
      }, 1000);
    }
    
    aboutToDisappear(): void {
      if (this.timerId) {
        clearInterval(this.timerId); // 清除定时器
        this.timerId = undefined;
      }
    }
    
  • 优化状态判断逻辑: 确保在定时器启动前,关键状态(如 UnLockTime)已正确恢复。可考虑将判断逻辑延迟一个周期执行,或增加状态标志位,避免初始误判。

  • 检查持久化数据读取: 确保 getTimeOut() 方法从持久化存储读取数据是同步且准确的,避免因异步延迟导致初始值错误。

  • 使用页面生命周期管理: 对于 HarmonyOS Next,确保页面生命周期回调(如 onPageShowonPageHide)与定时器联动,实现更精细的控制。

通过以上调整,应能解决杀后台后重新进入页面时的延迟问题。重点在于保证定时器的单一性和生命周期的同步清理。

回到顶部