uni-app Activity io.dcloud.PandoraEntryActivity has leaked ServiceConnection

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

uni-app Activity io.dcloud.PandoraEntryActivity has leaked ServiceConnection

开发环境 版本号 项目创建方式
Windows 11 HBuilderX

操作步骤:

  • 官网demo安装后,点击2次返回键退出程序时,就报错了。

预期结果:

  • 点击2次返回键退出程序时不会报错,app可以正常退出,不会报错。

实际结果:

android.app.ServiceConnectionLeaked: Activity io.dcloud.PandoraEntryActivity has leaked ServiceConnection com.bun.miitmdid.provider.zte.MsaClient$1[@f342dd2](/user/f342dd2) that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1835)
at android.app.LoadedApk.getServiceDispatcherCommon(LoadedApk.java:1707)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1686)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1819)
at android.app.ContextImpl.bindService(ContextImpl.java:1749)
at android.content.ContextWrapper.bindService(ContextWrapper.java:756)
at com.netease.nis.sdkwrapper.Utils.rL(Native Method)
at com.bun.miitmdid.provider.zte.MsaClient.BindService(Unknown Source:30)
at com.netease.nis.sdkwrapper.Utils.rL(Native Method)
at com.bun.miitmdid.provider.zte.ZteProvider.doStart(Unknown Source:27)
at com.bun.miitmdid.provider.BaseProvider$1.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
---------------------------- PROCESS ENDED (2917) for package com.android.UniPlugin ----------------------------
2024-10-30 10:50:22.184  2843-2879  libEGL                  com.android.UniPlugin                W  EGLNativeWindowType 0xe7d8b068 disconnect failed
2024-10-30 10:50:25.885  2843-2859  System                  com.android.UniPlugin                W  A resource failed to call dispose.
---------------------------- PROCESS ENDED (2843) for package com.android.UniPlugin ----------------------------

4 回复

我使用 最新版 HBuilderX 4.32,新建 hello uniapp vue2 ,在安卓真机上测试,两次返回退出 app 功能正常。具体描述一下你的操作步骤,你测试了几台设备,报错是否有规律


你好,我在oppo真机上测试,两次返回退出app正常。在小米平板(Android11系统)两次退出,控制台打印 android.app.ServiceConnectionLeaked: Activity io.dcloud.PandoraEntryActivity has leaked ServiceConnection错误。

回复 3***@163.com: 你我看你反馈的是 HBuilderX 低版本,最新版本是否有问题?最新版本 HBuilderX 内置的 hello uniapp 模版你运行是否有这个问题,多提供下你的测试结果,我好转给相关同事

在处理 uni-app 开发中遇到的 Activity io.dcloud.PandoraEntryActivity has leaked ServiceConnection 这类内存泄漏问题时,通常涉及到 Android 原生代码层面的处理,尤其是与 ServiceConnection 相关的管理。这类问题一般出现在 Android 应用中,当某个 ActivityFragment 绑定了一个 Service,但在 ActivityFragment 销毁时没有正确地解除绑定,导致内存泄漏。

虽然 uni-app 主要是基于 Vue.js 开发跨平台应用,但遇到原生 Android 层面的错误时,我们可能需要通过自定义原生插件或者修改原生代码来解决。以下是一个简化的示例,展示如何在原生 Android 中正确地管理 ServiceConnection,以避免内存泄漏。

示例代码

  1. 定义 ServiceConnection
private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 处理服务连接成功的逻辑
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // 处理服务断开的逻辑
    }
};
  1. 在 Activity 中绑定服务
@Override
protected void onStart() {
    super.onStart();
    Intent intent = new Intent(this, MyService.class);
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
  1. 在 Activity 销毁时解除绑定
@Override
protected void onDestroy() {
    super.onDestroy();
    // 确保在 Activity 销毁时解除绑定,避免内存泄漏
    unbindService(serviceConnection);
}

注意事项

  • 确保在 ActivityonDestroy() 方法中调用 unbindService(),这是防止内存泄漏的关键步骤。
  • 如果你的 uni-app 项目中涉及到了原生插件的开发,确保在插件的 ActivityFragment 中也遵循上述原则。
  • 如果问题依旧存在,可能需要检查是否有其他非预期的引用持有了 ActivityFragment 的实例,比如静态变量、匿名内部类中的隐式引用等。

通过上述代码示例,你可以在原生 Android 层面对 ServiceConnection 进行正确管理,从而避免 Activity io.dcloud.PandoraEntryActivity has leaked ServiceConnection 这类内存泄漏问题。如果问题复杂,可能需要深入分析具体的内存泄漏原因,使用 Android Studio 的 Profiler 或 LeakCanary 等工具进行辅助分析。

回到顶部