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. どうすれば修正できますか?

ここに投稿されたルーチンに従って電話ギャラリーから画像を選択すると発生します。アクティビティのレイアウトで定義されている [ギャラリーの閲覧] ボタンを押したときとまったく同じです。


完全な 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

これは古いことは知っていますが、同じ問題があり、奇妙ですが、偶然に答えに出くわしたと思います。

エミュレーター内で、共有インテントなどのアプリケーション ピッカーを発生させたり、ギャラリー アプリを選択したりするために何らかの操作を行うと、アプリケーションが 1 つしかない場合にのみ例外が発生し、ユーザーがアプリケーションを選択しなくてもアプリケーションが自動的に読み込まれます。

たとえば、画像を選択します。ルーチンを実行して画像を選択すると、電話の選択ダイアログにいくつかの選択肢が表示される可能性が高くなります。ただし、エミュレーターでは、デフォルトのギャラリー アプリケーション以外のものはほとんどありません。

それが 1 つのアプリケーションであり、それが読み込まれると、例外が発生します。

選択できるアプリケーションが複数ある場合、例外は発生しません。

テキスト ファイルを共有する場合も同様です。エミュレータでは、テキスト ファイルが自動的にメッセージング アプリケーションを直接ロードし、例外が発生します。

ここに画像の説明を入力

電子メール アプリケーションをセットアップすると、セレクターに 2 つのアプリケーションが表示されます。例外はありません。

ここに画像の説明を入力

これは内部エラー メッセージのように見えるため、無視しても問題ないと思います。

2 つ目のギャラリー アプリケーションをインストールして、エラー メッセージが表示されないことを確認することで、これを再現できます。

これも同じ提案を説明していることに気付きました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 の質問を確認することもできます。 Intent.createChooser() に BroadcastReceiver が必要な理由と実装方法 .

ResolverActivityが a を登録することを明確に示していますがBroadcastReceiver、常に登録を解除するとは限りません。

さらに:

Intent.createChooser() は ResolverActivity を開始します。onCreate() では、アクティビティが呼び出します

mPackageMonitor.register(this, false);

mPackageMonitor は BroadcastReceiver であり、その中register()で自身をアクティビティに登録します。通常、受信者は に登録されていませんonStop()。ただし、onCreate()コードの後半では、ユーザーが選択できるオプションの数がチェックされます。1 つしかない場合は、 を呼び出しますfinish()finish()が呼び出されるためonCreate()、他のライフサイクル メソッドが呼び出されることはなく、直接ジャンプし onDestroy()てレシーバーをリークします。

しかし、バグが修正されたかどうかはわかりません。おそらく誰かがそれについてより多くの情報を提供できますか?

于 2012-07-04T10:04:26.243 に答える
0

この投稿を読んでいて、チューザーが使用できるアプリケーションが1つだけ返されたときにこのエラーが発生する場合は、Androidのバグである可能性があります。ここで提起された問題があります。

他のレポートを読むと、できることは何もないようです...

于 2012-11-05T20:32:53.313 に答える