Мониторинг подключения к Интернету каждый раз, когда приложение открывается в Android

Я проверяю возможность подключения устройства, как указано в этом вопросе следующим кодом:

final ConnectivityManager conMgr =  (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.getState() == NetworkInfo.State.CONNECTED) {
    //notify user you are online
} else {
    //notify user you are not online
} 

У меня это есть в моем основном Activity, и он работает нормально, но сейчас я хотел бы проверять подключение к Интернету каждый раз, когда приложение запускается, иногда приложение остается в каком-то состоянии, а затем Интернет отключается, поэтому, когда оно снова открывается, он не выполняет основную деятельность, поэтому ничего не проверяется.

Как предлагается в этом вопросе, я следил за это руководство по мониторингу интернет-активности с помощью BroadcastReceiver, и я пытаюсь отобразить и AlertDialog, когда noConnectivity истинно, но ничего не происходит.

Это мой код, использующий упомянутый выше учебник:

public class MyActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.welcome);

    registerReceivers() ;
         (..my activity code goes here...)

}   

    private void noInternet()
    {
        Intent myIntent = new Intent(this, NoInternetActivity.class);
        startActivity(myIntent);
    }

    /*
     * method to be invoked to register the receiver
     */
    private void registerReceivers() {    
        registerReceiver(mConnReceiver, 
            new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    }

    private void alert()
    {
        AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setTitle("internet connection");
        alertDialog.setMessage("To use this app you need intenet connection");
        alertDialog.setButton("ok", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int which) {
              // here you can add functions
           }
        });
        alertDialog.show();
    }

    private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            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);

            // do application-specific task(s) based on the current network state, such 
            // as enabling queuing of HTTP requests when currentNetworkInfo is connected etc.

            if(noConnectivity)
            {
                alert();
                noInternet();
            }

        }
    };
}

но ни alert(), ни noInternet() не загорелись.

Надеюсь, ты сможешь мне помочь. Спасибо


person marimaf    schedule 13.05.2012    source источник


Ответы (2)


Если вы хотите запускать какой-либо код каждый раз, когда ваша деятельность возобновляется, даже если она уже открыта, переопределите и поместите свой код проверки в onResume(). Это вызывается каждый раз, когда открывается действие.

person Tim    schedule 13.05.2012
comment
но буду ли я делать это в каждой моей деятельности? - person marimaf; 13.05.2012
comment
Если вам нужно подключаться к каждому занятию, я могу это сделать. Это будет сложно или проблематично? - person Tim; 14.05.2012
comment
Я бы сказал, что 95% моих классов активности нуждаются в подключении, поскольку они получают динамический контент с сервера. Я не считаю, что добавление этого к каждому занятию - лучшее решение, но я могу в конечном итоге сделать это, если не найду лучшего. Спасибо - person marimaf; 14.05.2012

В вашем случае вы перемещаете этот registerReceivers в методы onStart или onResume.

Теперь, если вы хотите, чтобы он присутствовал в каждом действии, создайте базовое действие [BaseActivity], которое расширяет действие, и поместите этот метод в onStart или onResume в этом базовом классе. Теперь расширьте каждое из ваших действий из этого BaseActivity.

Будьте осторожны, не помещайте их в методы жизненного цикла фрагментов, если вы используете фрагменты.

person achie    schedule 26.06.2012