uni-app 通过本地通知消息进入app 会执行两次onShow和onHide

uni-app 通过本地通知消息进入app 会执行两次onShow和onHide

操作步骤:

安卓通过本地创建的消息,在app为主屏显示,下拉点击通知栏,会执行两次onHide和onShow方法,app不为主屏显示的时候点击只会显示一次onHide和onShow方法。这个问题会导致我在onShow多次连接socket失败的问题

预期结果:

希望只执行一次onHide和onShow

实际结果:

执行两次次onHide和onShow

bug描述:

安卓通过本地创建的消息,在app为主屏显示,下拉点击通知栏,会执行两次onHide和onShow方法,app不为主屏显示的时候点击只会显示一次onHide和onShow方法。这个问题会导致我在onShow多次连接socket失败的问题。 并且通过runtime,只要点击了通知栏,runtime的进入的app的方式就从default变成了push,而不是default。切换前后台还是push方式。 逛了论坛和手册都没有相关的说明,所以想请教下官方是机制如初,还是bug 附件中有简单的demo。如果出现两次生命周期,怎么解决在onShow,onHide中代码逻辑的问题

信息类别 信息内容
产品分类 uniapp/App
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 mac os 12.3.1
HBuilderX类型 正式
HBuilderX版本号 3.4.6
手机系统 Android
手机系统版本号 Android 7.0
手机厂商 华为
手机机型 华为P9
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

Image

demo1.zip


更多关于uni-app 通过本地通知消息进入app 会执行两次onShow和onHide的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

由于没有你描述的设备 测试几款其他手机 未复现你描述的问题。你换其他手机设备试试呢

更多关于uni-app 通过本地通知消息进入app 会执行两次onShow和onHide的实战教程也可以访问 https://www.itying.com/category-93-b0.html


你好,我描述了,华为P9,麻烦您们在测试下呢

回复 benqiao: 我说了 我们没有你描述的设备。。。

回复 DCloud_Android_ST: 不好意思,我看错了,我想办法找其他安卓设备试一试看,不好意思,感谢您的回答

在 Uni-App 中,通过本地通知消息进入应用时,onShowonHide 生命周期函数可能会被触发多次,这通常是由于以下原因导致的:

1. 通知点击事件的重复触发

当用户点击通知进入应用时,系统可能会多次触发通知点击事件,导致 onShowonHide 被多次调用。

2. 应用状态切换

当应用从后台切换到前台时,onShow 会被触发;当应用从前台切换到后台时,onHide 会被触发。如果应用在切换过程中状态不稳定,可能会导致多次触发。

3. Uni-App 的生命周期管理

Uni-App 的生命周期管理在某些情况下可能会出现重复触发的问题,尤其是在处理通知消息时。

解决方案

1. 防抖处理

可以在 onShowonHide 中添加防抖逻辑,确保在一定时间内只执行一次。

let lastShowTime = 0;
let lastHideTime = 0;
const debounceTime = 500; // 500ms 防抖时间

export default {
  onShow() {
    const now = Date.now();
    if (now - lastShowTime > debounceTime) {
      lastShowTime = now;
      // 你的逻辑代码
      console.log('onShow');
    }
  },
  onHide() {
    const now = Date.now();
    if (now - lastHideTime > debounceTime) {
      lastHideTime = now;
      // 你的逻辑代码
      console.log('onHide');
    }
  }
}

2. 检查应用状态

onShowonHide 中检查应用的状态,确保只在特定状态下执行逻辑。

let isAppActive = true;

export default {
  onShow() {
    if (!isAppActive) {
      isAppActive = true;
      // 你的逻辑代码
      console.log('onShow');
    }
  },
  onHide() {
    if (isAppActive) {
      isAppActive = false;
      // 你的逻辑代码
      console.log('onHide');
    }
  }
}

3. 使用全局变量控制

可以使用全局变量来控制 onShowonHide 的执行次数。

let isShowExecuted = false;
let isHideExecuted = false;

export default {
  onShow() {
    if (!isShowExecuted) {
      isShowExecuted = true;
      // 你的逻辑代码
      console.log('onShow');
    }
  },
  onHide() {
    if (!isHideExecuted) {
      isHideExecuted = true;
      // 你的逻辑代码
      console.log('onHide');
    }
  }
}

4. 检查通知来源

onShow 中检查是否是通过通知进入应用的,如果是,则执行相应的逻辑。

export default {
  onShow(options) {
    if (options.referrerInfo && options.referrerInfo.appId === 'your_notification_app_id') {
      // 通过通知进入应用的逻辑
      console.log('onShow from notification');
    } else {
      // 其他情况的逻辑
      console.log('onShow from other');
    }
  }
}
回到顶部