Sprawdzanie łączności sieciowej za pomocą BroadcastReceiver w Androidzie

Używam BroadcastReceiver, aby sprawdzić łączność sieciową, gdy moja aplikacja jest uruchomiona.Połączyłem BroadcastReceiver z Activity inorder, aby przynieść kilka kontrolek, takich jak AlertDialog, podczas gdy łączność spada. ale teraz nie chcę ograniczać tego odbiornika do konkretnej aktywności, zamiast tego chcę, aby to było stosowane dla całej mojej aplikacji (wszystkie działania). Więc w jaki sposób powinienem postępować, aby to zrobić?..

To jest kod, którego użyłem.Proszę pozwól ja wiem, czy mój kod osiąga standard i proszę mnie poprawić, jeśli poszły gdzieś źle.

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();
    }



    }
};
}
Każdy rodzaj pomocy jest wysoko ceniony.

Thanks

Author: skaffman, 2011-05-30

2 answers

Myślę, że masz 2 opcje.

Pierwsza opcja

Najpierw należy zarejestrować odbiornik nie za pomocą kodu, ale w pliku manifestu . W ten sposób jest on automatycznie rejestrowany dla Twojej aplikacji. W Twoim odbiorniku musisz zapisać aktualny stan sieci gdzieś centralnie być może w niestandardowej klasie aplikacji lub klasie singleton.

Zaimplementuj jakiś wzórobserwatora , aby Twoje działania mogły Zarejestruj się do niestandardowej klasy aplikacji, która przechowuje stan sieci. Klasa aplikacji informuje następnie każdą zarejestrowaną aktywność o zmianie stanu sieci.

Rejestrujesz klasę activity I wyrejestrowujesz się do/z klasy aplikacji w OnCreate () i onDestroy () (lepiej byłoby onResume () i onPause ()), więc otrzymują informacje o zmianach sieci tylko wtedy, gdy są widoczne.

Druga opcja

Inną opcją byłoby trzymanie się ciebie aktualny kod i przytrzymaj odniesienie do odbiornika Broadcast gdzieś centralnie, znowu niestandardowa Klasa aplikacji wykonałaby zadanie.

Aby Twoje działania wiedziały, gdzie znaleźć odbiorcę do rejestracji i wyrejestrowania. Ale pamiętaj, że musisz znaleźć miejsce, w którym zainicjujesz odbiornik. Należy również pamiętać, że musisz obsłużyć przypadek, w którym aplikacja może zostać zamknięta przez Androida z powodu niskiej pamięci i ponownie uruchomiona później, będziesz musiał odtworzyć swój odbiornik.

 14
Author: Flo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-30 14:08:07

Opcja pierwsza Flo jest poprawna, aby nadawca był globalny, włączając go do pliku manifestu. istnieje inna opcja, zrobić aktywność jako aktywność bazową i rozszerza całą swoją aktywność z tym i zarejestrować odbiorcę w aktywności bazowej.

 1
Author: maddy d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-03 06:30:14