Цель состоит в том, чтобы реализовать BroadcastReceiver в моем приложении для Android, которое динамически определяет, когда устройство меняет статус подключения или отключения к Интернету. Я пытался использовать несколько руководств и предложений по решению, но мне все еще не удается заставить его работать правильно, и я всегда получаю одно и то же: ошибка «leaked IntentReceiver».
Соответствующий код: Сначала я пишу класс, производный от класса BroadcastReceiver:
public class InternetConnector_Receiver extends BroadcastReceiver {
public InternetConnector_Receiver() {}
@Override
public void onReceive(Context context, Intent intent) {
try {
boolean isVisible = MyApplication.isActivityVisible();// Check if activity is visible or not
Log.i("Activity is Visible ", "Is activity visible : " + isVisible);
// If it is visible then trigger the task else do nothing
if (isVisible == true) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
// Check internet connection and accrding to state change then text of activity by calling method
if (networkInfo != null && networkInfo.isConnected()) {
new LMMoviesMainActivity().TTSstatusDataNetChanged(true);
} else {
new LMMoviesMainActivity().TTSstatusDataNetChanged(false);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Затем я создаю связанные переменные в LMMoviesMainActivity.
Вопрос. Правильно ли активируют 3 действия, добавленные в IntentFilter, обнаружение подключения к Интернету? Если они неверны, каковы правильные значения?
private IntentFilter internetConnectionGloIntentFilter;
private InternetConnector_Receiver objGloInternetConnectorReceiver;
internetConnectionGloIntentFilter = new IntentFilter();
internetConnectionGloIntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
internetConnectionGloIntentFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
internetConnectionGloIntentFilter.addAction("android.net.wifi.STATE_CHANGE");
objGloInternetConnectorReceiver = new InternetConnector_Receiver();
registerReceiver(objGloInternetConnectorReceiver, internetConnectionGloIntentFilter);
Наконец, функция, содержащая инструкции для выполнения при изменении подключения к Интернету:
public void TTSstatusDataNetChanged(boolean isConnectedBool) {
unregisterReceiver(objGloInternetConnectorReceiver);
registerReceiver(objGloInternetConnectorReceiver, internetConnectionGloIntentFilter);
// Change status according to boolean value
if (isConnectedBool) {
if (ttsSettingsGloDialog.isShowing()) {
ttsWarningsGloTextView.setText( "Net ON" );
}
dataNetConnectedGloBool = true;
} else {
if (ttsSettingsGloDialog.isShowing()) {
ttsWarningsGloTextView.setText( "Net Off" );
}
dataNetConnectedGloBool = false;
}
}
Пытаюсь выполнить: unregisterReceiver, получаю сообщение:
Служба com.google.android.youtube.api.service.YouTubeService обнаружила IntentReceiver wuq@3967361, который изначально был зарегистрирован здесь. Вы пропустили вызов unregisterReceiver()?
Но я предполагаю, что я должен отменить регистрацию Receiver, а затем зарегистрировать его снова, чтобы быть готовым к следующему событию подключения, верно? Если текущий unregisterReceiver не относится к намерению или инициированному событию, то как правильно написать инструкцию и связать ее?
Я проверил в отладчике, что Intent срабатывает, и BroadcastReceiver получает событие, но я просто не знаю, как преодолеть эту просочившуюся ошибку. Любые идеи? Я упускаю что-то важное? Вы видите ошибку? Спасибо за ваш интерес.