2017-06-13 10 views
-1

Ich möchte die Internetverbindung kontinuierlich auf jede Aktivität mit dem Broadctreceiver überprüfen. Ich schreibe den Code und es funktioniert perfekt. Aber ich möchte es in jeder Aktivität verwenden. Wie kann ich diesen Code ändern?Android Überprüfen Sie die Internetverbindung kontinuierlich

public class MainActivity extends Activity { 



private static final String LOG_TAG = "CheckNetworkStatus"; 
private NetworkChangeReceiver receiver; 
private boolean isConnected = false; 
private TextView networkStatus; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
    receiver = new NetworkChangeReceiver(); 
    registerReceiver(receiver, filter); 

    networkStatus = (TextView) findViewById(R.id.networkStatus); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

@Override 
protected void onDestroy() { 
    Log.v(LOG_TAG, "onDestory"); 
    super.onDestroy(); 

    unregisterReceiver(receiver); 

} 


public class NetworkChangeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 

    Log.v(LOG_TAG, "Receieved notification about network status"); 
    isNetworkAvailable(context); 

    } 


    private boolean isNetworkAvailable(Context context) { 
    ConnectivityManager connectivity = (ConnectivityManager) 
    context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivity != null) { 
    NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
    if (info != null) { 
    for (int i = 0; i < info.length; i++) { 
     if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
     if(!isConnected){ 
     Log.v(LOG_TAG, "Now you are connected to Internet!"); 
     networkStatus.setText("Now you are connected to Internet!"); 
     isConnected = true; 
     //do your processing here --- 
     //if you need to post any data to the server or get status 
     //update from the server 
     } 
     return true; 
     } 
    } 
    } 
    } 
    Log.v(LOG_TAG, "You are not connected to Internet!"); 
    networkStatus.setText("You are not connected to Internet!"); 
    isConnected = false; 
    return false; 
    } 
} 


} 
+0

was meinst du mit "kontinuierlich"? –

+0

Wie Facebook, das gleichzeitig die Internetverbindung überprüft. Wenn ich das Wifi/Mobile trenne, wird eine Nachricht in der Snackbar angezeigt ("Disconnect"). –

+0

Dies wird nicht ständig überprüft. Es bekommt ein Ereignis, wenn sich etwas ändert und darauf reagiert. –

Antwort

3

Ich mag es in jeder Aktivität verwenden. Wie kann ich diesen Code ändern?

erstellen BaseActivity Klasse, die AppCompatActivity erstreckt, und dann alle Ihre Activity Klassen machen diese BaseActivity Klasse erweitern. Setzen Sie Ihren Code, um die Internetverbindung in der BaseActivity Klasse zu überprüfen. Prost :)

+0

Ich möchte die Internetverbindung bei jeder geöffneten Aktivität ständig prüfen. Ich denke nicht, dass dies nicht helfen wird. –

+0

@JewelMahmudNimulShamim die Sache ist, müssen Sie den Code, den Sie verwenden, um Konnektivität in BaseActivity überprüfen, so dass jede Aktivität, die BaseActivity erweitert wird diesen Code haben. dies ist eine sehr gute Möglichkeit, Ihr Problem zu lösen – lelloman

+0

Könnten Sie mir bitte eine Demo geben.Ich habe versucht 5times nicht wissen, wo ich Fehler gemacht habe. –

0

Erstellen Sie einen Dienst. Starten Sie den Dienst in der Launcher-Aktivität, und fügen Sie den Netzwerkprüfungscode in diesen Dienst ein.

public class NetworkServiceextends Dienst {

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //register receiver here 
    // connection check code 
    return START_STICKY; 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO: Return the communication channel to the service. 
    throw new UnsupportedOperationException("Not yet implemented"); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    // unregister receiver 

} 

}

0

Sie Ihre BroadcastReceiver in seiner eigenen Klasse setzen, und dann erklären/registrieren Sie es in Ihrem Manifest. Auf diese Weise wird die Lebensdauer Ihrer Anwendung geteilt.

Ein weiterer Vorteil ist, dass Sie sich nicht um die Registrierung kümmern müssen, damit Sie sich keine Gedanken über Speicherlecks machen müssen.

+0

Dies funktioniert nicht, wenn Ihre App auf Android 7 (API 24) oder höher abzielt. Die einzige zuverlässige Möglichkeit, diese Ereignisse zu erhalten, wenn Sie API> = 24 als Ziel haben, ist die programmgesteuerte Registrierung des Empfängers. –

+0

Können Sie bitte erklären warum? Oder stellen Sie einige Quellen zur Verfügung? –

+0

https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION Ab Android 7 wird CONNECTIVITY_ACTION nicht mehr an Empfänger mit Manifesteinträgen übermittelt. Dies liegt daran, dass sich alle Anwendungen für dieses Ereignis registrieren und es zu teuer ist, alle Anwendungen zu benachrichtigen, wenn sich die Konnektivität ändert. Beginnend mit API 24 benachrichtigt Android nur laufende Apps, die einen Empfänger explizit registriert haben. –

Verwandte Themen