ChooserActivity утекла IntentReceiver
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()?
- Что означает эта ошибка?
- Поскольку приложение продолжает работать, я должен его игнорировать?
- Как я могу это исправить?
Это происходит, когда я выбираю изображение из галереи телефона, следуя процедуре, размещенной здесь. Именно тогда, когда я нажимаю кнопку "Обзор галереи", определенную в макете упражнения.
Полный 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 ответов
Я знаю, что это старше, но у меня была та же проблема, и я думаю, что наткнулся на ответ случайно, хотя это странно.
В эмуляторе, если вы делаете что-то, чтобы вызвать средство выбора приложения, такое как намерение общего доступа, или выбираете приложение галереи, у него, как представляется, есть Исключение, только если есть только одно приложение, и оно автоматически загружает приложение без вашего выбора.
Например, вы хотите выбрать изображение. Если вы запустите процедуру выбора изображения, скорее всего, у вас появится несколько вариантов выбора в диалоговом окне выбора на вашем телефоне. Однако в эмуляторе у вас редко есть что-либо, кроме приложения "Галерея" по умолчанию.
Когда это только одно приложение и оно загружается, вы получаете исключение.
Если у вас есть несколько приложений на выбор, вы не получите никаких исключений.
То же самое происходит, если вы хотите поделиться текстовым файлом. В эмуляторе текстовый файл автоматически загрузит приложение обмена сообщениями, и вы получите исключение.
Если вы настроите приложение электронной почты, оно будет отображать два приложения в окне выбора. У тебя не будет никаких исключений.
Я считаю, что вы можете спокойно проигнорировать это, так как это выглядит как внутреннее сообщение об ошибке.
Вы можете попытаться воспроизвести это, установив второе приложение галереи, чтобы увидеть, что оно не создает сообщение об ошибке.
Я только заметил, что это также описывает то же самое предложение /questions/39742076/zachem-intentcreatechooser-nuzhen-broadcastreceiver-i-kak-ego-realizovat/39742085#39742085
Если вы действительно хотите избежать этого исключения, то есть более сложный обходной путь.
Это о жизненном цикле.
Это означает, что вы зарегистрировали IntentReceiver
где-то, но не удалось отменить его регистрацию, пока приложение не было приостановлено Android.
Вы должны отменить регистрацию получателя в onPause
метод и в onRestart
перерегистрировать получателя. Поэтому переопределите эти методы и сделайте это так, как я хотел.
Эта ошибка, кажется, вызвана ошибкой в исходном коде Android, так как я никогда не регистрировал Intent Receiver
в моем.
Вы также можете проверить этот вопрос SO для деталей. Почему Intent.createChooser() нужен BroadcastReceiver и как его реализовать?,
Это ясно говорит о том, что ResolverActivity
регистрирует BroadcastReceiver
, но не всегда отменяет регистрацию.
Более того:
Intent.createChooser() запустит ResolverActivity. В onCreate() активность вызывает
mPackageMonitor.register(this, false);
mPackageMonitor является BroadcastReceiver и в пределах
register()
он регистрируется на активность. Обычно получатель незарегистрирован вonStop()
, Однако позже вonCreate()
код проверяет, сколько опций может выбрать пользователь. Если есть только один, это вызываетfinish()
, посколькуfinish()
называется вonCreate()
другие методы жизненного цикла никогда не вызываются, и он переходит прямо кonDestroy()
- утечка приемника.
Но у меня нет идеи, если ошибка была исправлена, может быть, кто-то, кто может предоставить больше информации об этом?
Я не уверен на 100%, но если он работает нормально И выдает исключение, вероятно, вам ничего не нужно делать. Это может быть проблема вашего устройства, например, ошибка в настройке ОС Android производителя. Попробуйте проверить его на эмуляторе, если он не выдаст исключение, просто оставьте его как есть. Я думаю, что ваш код в порядке.
Если вы читаете этот пост и получаете эту ошибку, когда возвращается только одно приложение, доступное для выбора, то, скорее всего, это ошибка Android. Здесь возникла проблема.
Из прочтения других отчетов выясняется, что ничего не поделаешь...