1
E/ActivityThread(  655): Activity com.android.internal.app.ChooserActivity has
leaked IntentReceiver com.android.internal.app.ResolverActivity$1@412f4f38 
that was originally registered here. 

Are you missing a call to unregisterReceiver()? E/ActivityThread(  655): 
android.app.IntentReceiverLeaked: 
Activity com.android.internal.app.ChooserActivity has leaked IntentReceiver 
com.android.internal.app.ResolverActivity$1@412f4f38 that was originally 
registered here. Are you missing a call to unregisterReceiver()?
  1. 这个错误是什么意思?
  2. 由于应用程序继续工作,我应该忽略它吗?
  3. 我该如何解决?

当我按照此处发布的例程从手机图库中选择图像时,就会发生这种情况。正是当我按下 Activity 布局中定义的浏览图库按钮时。


完整的 LOGCAT:

E/ActivityThread(  655):    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
E/ActivityThread(  655):    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
E/ActivityThread(  655):    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1043)
E/ActivityThread(  655):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1030)
E/ActivityThread(  655):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1024)
E/ActivityThread(  655):    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
E/ActivityThread(  655):    at com.android.internal.content.PackageMonitor.register(PackageMonitor.java:65)
E/ActivityThread(  655):    at com.android.internal.app.ResolverActivity.onCreate(ResolverActivity.java:99)
E/ActivityThread(  655):    at com.android.internal.app.ChooserActivity.onCreate(ChooserActivity.java:53)
E/ActivityThread(  655):    at android.app.Activity.performCreate(Activity.java:4465)
E/ActivityThread(  655):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/ActivityThread(  655):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
E/ActivityThread(  655):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/ActivityThread(  655):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/ActivityThread(  655):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/ActivityThread(  655):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/ActivityThread(  655):    at android.os.Looper.loop(Looper.java:137)
E/ActivityThread(  655):    at android.app.ActivityThread.main(ActivityThread.java:4424)
E/ActivityThread(  655):    at java.lang.reflect.Method.invokeNative(Native Method)
E/ActivityThread(  655):    at java.lang.reflect.Method.invoke(Method.java:511)
E/ActivityThread(  655):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/ActivityThread(  655):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/ActivityThread(  655):    at dalvik.system.NativeStart.main(Native Method)
4

5 回答 5

8

我知道这是较旧的,但是我遇到了同样的问题,并且认为我偶然发现了答案,尽管这很奇怪。

在模拟器中,如果您执行某些操作以导致应用程序选择器(例如共享意图)或选择图库应用程序,则它似乎只有在只有一个应用程序的情况下才会出现异常,并且在您没有选择的情况下自动加载该应用程序。

例如,您想选择一张图片。如果您运行例程来选择图像,您很可能会在手机的选择器对话框中出现一些选择。但是在模拟器上,除了默认的 Gallery 应用程序之外,您几乎没有其他任何东西。

当它只有一个应用程序并加载时,您会得到一个异常。

如果您有多个应用程序可供选择,则不会出现异常。

如果您想共享文本文件,也会发生同样的事情。在模拟器上,文本文件会直接自动加载一个消息应用程序,你会得到一个异常。

在此处输入图像描述

如果您设置电子邮件应用程序,它将在选择器中显示两个应用程序。你不会有任何例外。

在此处输入图像描述

我相信您可以放心地忽略这一点,因为它似乎是一个内部错误消息。

您可以尝试通过安装第二个图库应用程序来重现此问题,以查看它不会创建错误消息。

我刚刚注意到这也描述了相同的建议https://stackoverflow.com/a/10290486/935779

如果你真的想避免这个异常,它有一个更复杂的工作。

于 2012-08-31T02:53:39.203 回答
2

这是关于生命周期的。

这意味着您已经注册了IntentReceiver某个地方,但在您的应用程序被 Android 暂停之前它未能取消注册。

您应该在onPause方法中取消注册接收器并onRestart重新注册接收器。所以覆盖这些方法并按照我的意思去做。

于 2012-07-03T10:27:37.710 回答
1

此错误似乎是由 Android 源代码中的错误引起的,因为我从未Intent Receiver在我的源代码中注册过。

您还可以查看这个 SO question 了解详细信息为什么 Intent.createChooser() 需要 BroadcastReceiver 以及如何实现?.

它清楚地表明ResolverActivity注册了 a BroadcastReceiver,但并不总是取消注册它。

此外:

Intent.createChooser() 将启动一个 ResolverActivity。在 onCreate() 中,活动调用

mPackageMonitor.register(this, false);

mPackageMonitor 是一个 BroadcastReceiver 并在register()其中注册自己的活动。通常,接收方未在onStop(). 但是,稍后在onCreate()代码中检查用户可以选择多少选项。如果只有一个,它会调用finish(). 由于finish()onCreate()其他生命周期方法中被调用,因此永远不会被调用,它会直接跳转到 onDestroy()- 泄漏接收器。

但我不知道该错误是否已修复,也许有人可以提供更多信息?

于 2012-07-04T10:04:26.243 回答
0

如果您正在阅读这篇文章并在仅返回一个可供选择器使用的应用程序时收到此错误,则很可能是 Android 错误。这里提出了一个问题。

通过阅读其他报告,似乎没有什么可以做的......

于 2012-11-05T20:32:53.313 回答
0

我不是 100% 确定,但如果它工作正常并且抛出异常,你可能不需要对此做任何事情。这可能是您设备的问题,例如,供应商 Android 操作系统自定义错误。尝试在模拟器上测试它,如果它不会抛出异常,就让它保持原样。我认为你的代码很好。

于 2014-02-12T12:36:33.687 回答