Утечка IntentReceiver в Android Marshmallow WifiManager

Вот сценарий: у меня есть LoginActivity, который использует WifiManager для получения IP-адреса следующим образом:

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String ipAddress = wifiManager.getConnectionInfo().getIpAddress();

Я не регистрирую приемники для получения каких-либо обновлений WiFi. Я использую WifiManager для получения IP-адреса только и ничего больше.

Теперь, когда я завершаю вход в систему, я вызываю finish() в LoginActivity и запускаю SplashActivity, и тогда я вижу следующий журнал в консоли:

LoginActivity слил IntentReceiver android.net.wifi.WifiManager, который изначально был зарегистрирован здесь. Вы пропустили вызов unregisterReceiver()?

И я получаю этот журнал только на зефире. Это никогда не происходит на устройствах ‹6.0. Также на зефире приложение никогда не падает, но я каждый раз вижу этот лог.

Если кто-нибудь может объяснить такое поведение?


person camelCaseCoder    schedule 26.04.2016    source источник
comment
Вы решили эту проблему? Я столкнулся с той же проблемой. Пожалуйста, обновите свой вопрос, если вы решили это. Спасибо.   -  person Vajira Lasantha    schedule 08.06.2016
comment
@VajiraLasantha Нет, не видел. Все еще жду, пока кто-нибудь ответит.   -  person camelCaseCoder    schedule 08.06.2016
comment
@VajiraLasantha Посмотрите ответ Кая ниже и дайте мне знать.   -  person camelCaseCoder    schedule 15.11.2016


Ответы (1)


У меня была такая же ошибка, но по какой-то причине только при запуске в отладке.

Добавление: getApplicationContext() исправил проблему для меня. (Хотя я не совсем уверен, почему?)

WifiManager wifi_manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

После небольшого дополнительного исследования кажется, что при переходе от одного действия к другому контекста больше не существует.

getApplicationContext() — возвращает контекст для всех действий, выполняемых в приложении.

getContext() — возвращает в контекстное представление только текущую активную активность.

Так что, вероятно, лучше всего использовать getApplicationContext() для всего, что должно выжить в течение всего срока службы вашего приложения.

person Kai    schedule 15.11.2016
comment
Да, ты прав. Я проверил это, и в журналах не было никаких исключений. Объяснение было бы отличным, но я все равно проголосую и приму ответ. Спасибо. - person camelCaseCoder; 15.11.2016
comment
Спасибо, я провел еще немного исследований и обновил свой ответ. - person Kai; 16.11.2016
comment
Да, это имеет смысл. Но все же немного странно, что IntentReceiver просочилась информация по этой причине. И также не забывайте, такое поведение только на устройствах 6.0+. Для устройств версии 6.0 getContext() работает нормально. - person camelCaseCoder; 16.11.2016