ChooserActivity泄露了IntentReceiver

时间:2012-07-03 09:41:12

标签: java android debugging android-activity memory-leaks

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. 我该如何解决?
  4. 当我在发布的例程here之后从手机图库中选择图像时,会发生这种情况。 正是当我按下活动布局中定义的浏览图库按钮时。


    完整的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)
    

5 个答案:

答案 0 :(得分:8)

我知道这已经老了,但是我遇到了同样的问题,并且认为我在事故中偶然发现了答案,虽然这很奇怪。

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

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

如果只有一个应用程序加载,则会出现异常。

如果您有多个应用程序可供选择,您将无法获得例外。

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

enter image description here

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

enter image description here

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

您可以尝试通过安装第二个图库应用程序来重现这一点,看它没有创建错误消息。

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

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

答案 1 :(得分:2)

这是关于生命周期的。

这意味着您已在某处注册了IntentReceiver 但是在你的应用程序被暂停之前它未能注销它 机器人。

您应该在onPause方法和onRestart重新注册接收器中取消注册接收器。因此,重写这些方法并按照我的意思去做。

答案 2 :(得分:1)

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

您还可以查看此SO问题以获取详细信息Why does Intent.createChooser() need a BroadcastReceiver and how to implement?

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

此外:

  

Intent.createChooser()将启动ResolverActivity。在onCreate()中,   活动呼叫

mPackageMonitor.register(this, false);
  

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

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

答案 3 :(得分:0)

如果您正在阅读此帖并且当只有一个应用程序返回为选择器可用时出现此错误,那么它很可能是Android错误。提出了一个问题here

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

答案 4 :(得分:0)

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