Проверка сетевого подключения с помощью BroadcastReceiver в Android - PullRequest
4 голосов
/ 30 мая 2011

Я использую BroadcastReceiver для проверки сетевого подключения во время работы моего приложения. Я связал BroadcastReceiver с параметром Activity, чтобы получить несколько элементов управления, таких как AlertDialog, в то время как подключение отключается. но теперь я не хочу ограничивать этот приемник определенным действием, а хочу, чтобы это применялось ко всему моему приложению (Все действия). Итак, каким образом я должен идти, чтобы сделать это ...

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

package com.xx.mobile;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


public class CheckforConnectivity extends Activity {
private static final String LOG_TAG = CheckforConnectivity.class.getSimpleName();
static final String ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
private boolean mActiveNetState = false;
private boolean mMobileNetState = false;
private boolean mStatus = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    IntentFilter filter = new IntentFilter(ACTION);
    this.registerReceiver(ConnectivityCheckReceiver, filter);
}

@Override
protected void onDestroy(){
    super.onDestroy();
    unregisterReceiver(ConnectivityCheckReceiver);
}



private final BroadcastReceiver mConnectivityCheckReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
                boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
                    NetworkInfo currentNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
        Log.i(TAG, "Status : " + noConnectivity + ", Reason :" + reason + ", FailOver :" + isFailover + ", Current Network Info : " + currentNetworkInfo + ", OtherNetwork Info :" + otherNetworkInfo);

        mStatus = noConnectivity;
        Log.d(TAG, "Status :" + mStatus);

        if(mStatus){
        AlertDialog.Builder builder = new AlertDialog.Builder(NotifySMSReceived.this);
        builder.setMessage("Connection is not Available !");
        builder.setTitle("Info");
        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();

            }

        });
        AlertDialog alert = builder.create();
        alert.show();
    }
    else {

            AlertDialog.Builder builder = new AlertDialog.Builder(NotifySMSReceived.this);
            builder.setMessage("Connection is Available !");
            builder.setTitle("Info");
            builder.setPositiveButton("Ok", new DialogInterface.OnClickListener(){

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();

                }

            });
            AlertDialog alert = builder.create();
            alert.show();
    }



    }
};
}

Любая помощь высоко ценится.

Спасибо

Ответы [ 2 ]

14 голосов
/ 30 мая 2011

Я думаю, у вас есть 2 варианта.

Первый вариант

Сначала вы должны зарегистрировать получателя не с кодом, а в файле манифеста ,Таким образом, он автоматически регистрируется для вашего приложения.Внутри вашего приемника вы должны хранить текущее состояние сети где-то централизованно, возможно, в пользовательском приложении классе или в одноэлементном классе.

Реализация какого-либо шаблона наблюдателя , чтобы ваши действия могли регистрироваться в вашем пользовательском классе Application, который содержит состояние сети.Класс Application затем информирует каждое зарегистрированное действие об изменении состояния сети.

Вы регистрируете и отменяете класс активности в классе Application в onCreate () и onDestroy () (лучше было бы onResume () и onPause ()), поэтому они получают информацию только об изменениях сети, когда онивидимый.

Второй вариант

Другой вариант - прикрепить текущий код и где-то централизованно сохранить ссылку на приемник Broadcast, опять же, пользовательский класс Application сделает эту работу..

Итак, ваши действия знают, где найти получателя для регистрации и отмены регистрации.Но имейте в виду, что вы должны найти место, где вы инициируете приемник.Также имейте в виду, что вам придется обрабатывать случай, когда ваше приложение может быть закрыто Android из-за нехватки памяти и перезапущено позже, затем вам придется заново создать ресивер.

1 голос
/ 03 марта 2014

Первый вариант Flo корректен для того, чтобы сделать Broadcast Receiver глобальным путем включения в файл манифеста.есть еще один вариант: сделать действие базовым и расширить с ним все свои действия и зарегистрировать получателя в базовом действии.

...