uni-app IUniMP.showUniMP()调用会默认关闭掉所有已打开的原生Activity

uni-app IUniMP.showUniMP()调用会默认关闭掉所有已打开的原生Activity

示例代码:

public static Boolean showLesApp(){
    Boolean isrun = false;
    IUniMP lesapp = mUniMPCaches.get("UNI9E2AE00");
    if(lesapp != null && lesapp.isRuning()){
        isrun = lesapp.showUniMP();
    }
    return isrun;
}

操作步骤:

  1. 启动app
  2. 退到后台
  3. 回到前台
  4. 调用IUniMP.showUniMP()
  5. 所有的已经打开在小程序上的原生Activity被关闭了

预期结果:

所有的已经打开在小程序上的原生Activity能保持状态,

实际结果:

所有的已经打开在小程序上的原生Activity被关闭了

bug描述:

IUniMP.showUniMP()调用会默认关闭掉所有已打开的原生Activity

DCUniMPSDK.getInstance().setUniMPOnCloseCallBack(new IUniMPOnCloseCallBack() {  
    @Override  
    public void onClose(String appid) {  

        Log.e("unimp", appid+"被关闭了");  
        //小程序被关闭需要对实例缓存删除操作  
        if(mUniMPCaches.containsKey(appid)) {  
            mUniMPCaches.remove(appid);  
        }  
    }  
});

Image


更多关于uni-app IUniMP.showUniMP()调用会默认关闭掉所有已打开的原生Activity的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

我读了好几遍,是真没看懂啥意思。
什么叫 小程序上的原生Activity被关闭了

更多关于uni-app IUniMP.showUniMP()调用会默认关闭掉所有已打开的原生Activity的实战教程也可以访问 https://www.itying.com/category-93-b0.html


IUniMP.showUniMP() 调用时关闭已打开的原生 Activity 是预期行为,并非 bug。这是因为 uni-app 小程序引擎在显示时会重新接管 Activity 栈管理。

原因分析:

  1. 小程序引擎启动时会创建独立的 Activity 栈(通常为 UniMPActivity
  2. 调用 showUniMP() 会触发引擎重新初始化当前栈顶 Activity
  3. 引擎为保证运行环境一致性,会清理非小程序相关的原生 Activity

解决方案:

  1. 使用 startUniMP() 替代:如果需要在保留原生 Activity 的同时启动小程序,应使用 DCUniMPSDK.getInstance().startUniMP() 方法,该方法支持配置启动模式。

  2. 配置 Activity 启动模式:在原生 AndroidManifest.xml 中为需要保留的 Activity 设置:

    android:launchMode="singleInstance"
    
  3. 监听生命周期回调:通过 IUniMPOnCloseCallBack 在关闭时保存状态,重新打开时恢复:

    // 保存 Activity 状态
    Bundle savedInstanceState = new Bundle();
    // 恢复时使用 savedInstance 恢复界面
    
  4. 检查引擎版本:升级到最新版 SDK(≥3.4.10),该问题在后续版本中有优化。

临时规避方案: 在调用 showUniMP() 前,先检查并手动重新打开需要保留的原生 Activity:

if (needKeepActivity != null && needKeepActivity.isFinishing()) {
    Intent intent = new Intent(context, TargetActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}
回到顶部