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 |
更多关于uni-app 通过本地通知消息进入app 会执行两次onShow和onHide的实战教程也可以访问 https://www.itying.com/category-93-b0.html
由于没有你描述的设备 测试几款其他手机 未复现你描述的问题。你换其他手机设备试试呢
更多关于uni-app 通过本地通知消息进入app 会执行两次onShow和onHide的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你好,我描述了,华为P9,麻烦您们在测试下呢
回复 benqiao: 我说了 我们没有你描述的设备。。。
回复 DCloud_Android_ST: 不好意思,我看错了,我想办法找其他安卓设备试一试看,不好意思,感谢您的回答
在 Uni-App 中,通过本地通知消息进入应用时,onShow
和 onHide
生命周期函数可能会被触发多次,这通常是由于以下原因导致的:
1. 通知点击事件的重复触发
当用户点击通知进入应用时,系统可能会多次触发通知点击事件,导致 onShow
和 onHide
被多次调用。
2. 应用状态切换
当应用从后台切换到前台时,onShow
会被触发;当应用从前台切换到后台时,onHide
会被触发。如果应用在切换过程中状态不稳定,可能会导致多次触发。
3. Uni-App 的生命周期管理
Uni-App 的生命周期管理在某些情况下可能会出现重复触发的问题,尤其是在处理通知消息时。
解决方案
1. 防抖处理
可以在 onShow
和 onHide
中添加防抖逻辑,确保在一定时间内只执行一次。
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. 检查应用状态
在 onShow
和 onHide
中检查应用的状态,确保只在特定状态下执行逻辑。
let isAppActive = true;
export default {
onShow() {
if (!isAppActive) {
isAppActive = true;
// 你的逻辑代码
console.log('onShow');
}
},
onHide() {
if (isAppActive) {
isAppActive = false;
// 你的逻辑代码
console.log('onHide');
}
}
}
3. 使用全局变量控制
可以使用全局变量来控制 onShow
和 onHide
的执行次数。
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');
}
}
}