uni-app 鸿蒙小程序SDK 点击胶囊关闭小程序后再次打开会闪退
uni-app 鸿蒙小程序SDK 点击胶囊关闭小程序后再次打开会闪退
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
uni小程序SDK | 2.3.15 | - |
测试过的手机
鸿蒙NEXT版本
示例代码:
// 可以设置导航栏样式
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
windowStage_ = windowStage
init(this, windowStage)
windowStage.loadContent('pages/login/advertisement', (err) => {
//由于时序问题,需要使用setTimeout保证页面压栈的顺序
setTimeout(() => {
//跳转支付页面
this.action()
})
AppStorage.setOrCreate('windowId', 0)
// 我的设置 蛇形图还是树形图
PersistentStorage.persistProp('across', false)
PersistentStorage.persistProp('size_option', 0)
AppStorage.setOrCreate('Fontsize', [12, 14, 16, 18])
AppStorage.setOrCreate('CityId', 2500)
// 搜索的数据
PersistentStorage.persistProp('history_records', [])
// 首页推荐优先还是收藏优先 默认推荐
PersistentStorage.persistProp('selectedIndex', 0)
// 打开获取位置的弹窗
reqPermissionsFromUser(this.context, ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION'])
let show_gg = (web: status) => {
let obj: webDetail = {
webUrl: web.msg.split('|')[1]
}
// 子窗口的逻辑
this.showSubWindow(obj)
}
this.context.eventHub.on('show_web', show_gg)
windowStage.getMainWindowSync().setWindowLayoutFullScreen(true) // 同意设置全屏
PersistentStorage.persistProp('tip',true)
// 添加换乘页面的线路
PersistentStorage.persistProp('search_line', [{
imag: $r('app.media.search_home'), text: {
showText: '回家'
}, address: null
}, {
imag: $r('app.media.search_work'), text: {
showText: '上班'
}, address: null
}])
});
// 设置成全屏
windowStage.getMainWindow((err, windowClass) => {
windowClass.setWindowLayoutFullScreen(true)
// 隐藏状态栏显示
// windowClass.setWindowSystemBarEnable(['navigation'])
// 获取顶部状态栏遮挡区域
let typeSystem = window.AvoidAreaType.TYPE_SYSTEM;
let avoidAreaWindow = windowClass.getWindowAvoidArea(typeSystem);
let statusTop = px2vp(avoidAreaWindow.topRect.height); // 获取状态栏的高度
// 2. 获取导航条避让遮挡的区域
let type = window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR;
let avoidArea = windowClass.getWindowAvoidArea(type);
let bottomRectHeight = px2vp(avoidArea.bottomRect.height); // 获取到导航条区域的高度
AppStorage.setOrCreate('statusTop', statusTop); // 存储状态栏高度
AppStorage.setOrCreate('statusBottom', bottomRectHeight); // 存储状导航条区域的高度
AppStorage.setOrCreate('BW', 1); // 存储全局UI设置是否黑白
})
操作步骤:
点击胶囊关闭小程序后再次打开会闪退(是整个app都没了不光小程序没了)
预期结果:
正常打开
实际结果:
闪退(是整个app都没了不光小程序没了)
bug描述:
Device info:HUAWEI Mate 60 Pro
Build info:ALN-AL00 5.0.0.112(SP1C00E110R4P22log)
Fingerprint:e5c641e513373774d54da66dbe76f7ab98f61d7e5c7932d19591c881ecdd8d3a
Module name:com.example.application369
Version:1.0.0
VersionCode:1000000
PreInstalled:No
Foreground:Yes
Pid:37722
Uid:20020004
Reason:Error
Error name:Error
Error message:This window state is abnormal.
Error code:
Stacktrace:
at getSafeAreaInsets (oh_modules/.ohpm/@dcloudio+uni-app-runtime@2.3.15/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:1125:1)
at aboutToAppear (oh_modules/.ohpm/@dcloudio+uni-app-runtime@2.3.15/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/components/Capsule.ets:127:44)
更多关于uni-app 鸿蒙小程序SDK 点击胶囊关闭小程序后再次打开会闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app 鸿蒙小程序SDK 点击胶囊关闭小程序后再次打开会闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对你提到的uni-app在鸿蒙小程序SDK中,点击胶囊按钮关闭小程序后再次打开会闪退的问题,这通常涉及到小程序的生命周期管理和资源回收。以下是一个可能的解决方案示例,主要关注于如何正确处理小程序的暂停和恢复状态,以及资源的管理。
代码示例
1. 在App.vue
中管理应用生命周期
首先,确保在App.vue
中正确处理应用的生命周期事件,特别是onHide
和onShow
事件。这些事件分别在应用进入后台和回到前台时触发。
<script>
export default {
onLaunch() {
console.log('App Launch');
// 初始化代码
},
onShow() {
console.log('App Show');
// 应用回到前台时执行的代码
// 比如重新初始化某些资源或状态
},
onHide() {
console.log('App Hide');
// 应用进入后台时执行的代码
// 比如暂停某些后台任务或释放资源
},
onError(err) {
console.error('App Error', err);
}
}
</script>
2. 检查并管理页面级生命周期
在每个页面中,同样需要关注页面的生命周期事件,特别是onUnload
和onLoad
事件,确保页面在卸载时正确释放资源。
<template>
<!-- 页面模板 -->
</template>
<script>
export default {
onLoad() {
console.log('Page Loaded');
// 页面加载时执行的代码
},
onUnload() {
console.log('Page Unloaded');
// 页面卸载时执行的代码
// 比如停止定时器、取消网络请求等
}
}
</script>
3. 资源管理
确保所有使用的资源(如定时器、网络请求、文件句柄等)在应用进入后台或页面卸载时被正确管理。例如,使用try...finally
结构确保资源释放。
let timer;
function startTask() {
timer = setInterval(() => {
// 执行某些任务
}, 1000);
}
function stopTask() {
clearInterval(timer);
timer = null;
}
// 在页面或应用的生命周期事件中调用
export default {
onLoad() {
startTask();
},
onUnload() {
stopTask();
}
}
总结
通过上述代码示例,你可以确保在应用或页面进入后台时,所有资源都被正确管理,从而避免因资源未释放导致的内存泄漏或应用异常。这有助于减少或避免在鸿蒙小程序SDK中点击胶囊关闭小程序后再次打开时的闪退问题。如果问题依然存在,建议进一步排查具体的错误日志或联系鸿蒙开发者支持获取帮助。