skipper92
skipper92
  • 发布:2022-01-24 11:19
  • 更新:2022-01-24 18:00
  • 阅读:620

【报Bug】关闭后台模式特定情况下宿主activity无法打开的问题

分类:uni小程序sdk

产品分类: uni小程序SDK

手机系统: Android

手机系统版本号: Android 11

手机厂商: OPPO

手机机型: K7x

页面类型: nvue

SDK版本号: 3.3.8

操作步骤:

登录app打开小程序,重复多次,再退出登录更换另一个账号登录,打开小程序,宿主activity无法启动

预期结果:

宿主activity能正常启动

实际结果:

宿主activity未能正常启动

bug描述:

关闭后台模式,在更换启动参数后有一定的概率会触发所有小程序都无法打开的问题(jsonobject 结构没有变化,只是改了值例如token等),没有任何错误信息,确认如下代码一定被执行

val uniMpOpenConfig = UniMPOpenConfiguration()    
    uniMpOpenConfig.splashClass = UniAppSplashView::class.java    
    uniMpOpenConfig.redirectPath = redirectPath    
    uniMpOpenConfig.extraData = jsonObject    
    val unImp = SoftReference(    
        DCUniMPSDK.getInstance().openUniMP(    
            context,    
            appId,    
            uniMpOpenConfig    
        )    
    )    
    mUniMPCaches[appId] = unImp    
    currentAppId = appId  

这个问题目前已经修复了,修复记录:我们app是需要登录才能进首页的,首页是原生开发,首页上的子模块大部分是小程序。之前复现就是第一次登录到首页,打开小程序多个正常。然后退出登录再换别的账号登录后就会复现问题。起初怀疑是不是透传参数中token值发生改变导致,通过验证排除。之后在思考目前多进程方案应该配合有一定的缓存策略,是否因为缓存问题导致(因为问题复现后没有任何错误提示,只是点击后宿主activity没有启动)。再次查询api,找到closeUniMP,首先猜测closeUniMP应该伴随着缓存的清理,那么后续就在退出登录后配合自身业务调用如下代码:


fun closeAllUniApp() {    
      mUniMPCaches.forEach { it.value.closeUniMP() }    
}  

问题得到解决。之后反复更换账号登录,问题没有再次出现。
但是这里有个问题就很疑惑,以至于之前我们这边根本没往这个方向考虑,既然是关闭后台的模式,为什么在小程序退出的时候没有清理干净,而后需要调用closeunimp

2022-01-24 11:19 负责人:DCloud_Android_DQQ 分享
已邀请:
DCloud_Android_DQQ

DCloud_Android_DQQ

1 小程序实例是多进程必然使用缓存的。
2 后台模式只能决定了每个小程序实例 是否出现在最近任务中。

  • skipper92 (作者)

    目前我猜测是否因为我们这边退出登录后finish home的原因,导致第一次缓存的cotext失效,从而发生宿主activity不能打开的问题。如果是这样能否内部处理,或者说在文档做一定的说明这种情况下closeUniMP的作用(因为目前的解决方案就是非业务的)。如果是内部能处理更好,升级sdk版本即可。

    2022-01-24 15:10

  • DCloud_Android_DQQ

    回复 skipper92: 你们期望 宿主销毁的时候,该宿主缓存的进程示例也销毁是吗

    2022-01-24 16:14

DCloud_Android_DQQ

DCloud_Android_DQQ

需要提供一个 可以复现问题的示例。 我没法定位问题。

  • skipper92 (作者)

    登录信息是存在sp里面的

    2022-01-24 18:04

该问题目前已经被锁定, 无法添加新回复