uni-app 鸿蒙小程序SDK 点击胶囊关闭小程序后再次打开会闪退

发布于 1周前 作者 wuwangju 来自 Uni-App

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

1 回复

更多关于uni-app 鸿蒙小程序SDK 点击胶囊关闭小程序后再次打开会闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对你提到的uni-app在鸿蒙小程序SDK中,点击胶囊按钮关闭小程序后再次打开会闪退的问题,这通常涉及到小程序的生命周期管理和资源回收。以下是一个可能的解决方案示例,主要关注于如何正确处理小程序的暂停和恢复状态,以及资源的管理。

代码示例

1. 在App.vue中管理应用生命周期

首先,确保在App.vue中正确处理应用的生命周期事件,特别是onHideonShow事件。这些事件分别在应用进入后台和回到前台时触发。

<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. 检查并管理页面级生命周期

在每个页面中,同样需要关注页面的生命周期事件,特别是onUnloadonLoad事件,确保页面在卸载时正确释放资源。

<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中点击胶囊关闭小程序后再次打开时的闪退问题。如果问题依然存在,建议进一步排查具体的错误日志或联系鸿蒙开发者支持获取帮助。

回到顶部