Gibt es ein Android Intent ACTION_XXX
, das mich benachrichtigt, wenn eine Internetverbindung verfügbar ist?
Ich möchte eine instanziieren BroadcastReceiver
, die meine Anwendung benachrichtigt, wenn ein Benutzer die Internetverbindung aktiviert (über WLAN, über GSM usw.).
Könnte mir jemand helfen?
android
android-intent
broadcastreceiver
CeccoCQ
quelle
quelle
Akzeptierte Antwort ist richtig. Ich füge nur Empfängercode zur Vervollständigung hinzu:
public class NetworkStateReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.d("app","Network connectivity change"); if(intent.getExtras()!=null) { NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { Log.i("app","Network "+ni.getTypeName()+" connected"); } else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { Log.d("app","There's no network connectivity"); } } }
quelle
BroadcastReceiver.onReceive
ist abstrakt, Sie können also nicht anrufensuper.onReceive(context, intent);
.Update auf @lujop Antwort:
public class NetworkStateReceiver extends BroadcastReceiver { private static final String TAG = "NetworkStateReceiver"; @Override public void onReceive(final Context context, final Intent intent) { Log.d(TAG, "Network connectivity change"); if (intent.getExtras() != null) { final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo ni = connectivityManager.getActiveNetworkInfo(); if (ni != null && ni.isConnectedOrConnecting()) { Log.i(TAG, "Network " + ni.getTypeName() + " connected"); } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { Log.d(TAG, "There's no network connectivity"); } } } }
quelle
EXTRA_NETWORK_INFO
. +1MyReceiver.java
public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(isConnected(context)) Toast.makeText(context, "Connected.", Toast.LENGTH_LONG).show(); else Toast.makeText(context, "Lost connect.", Toast.LENGTH_LONG).show(); } public boolean isConnected(Context context) { ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnected(); return isConnected; } }
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
AKTUALISIEREN
Verwendung
connection = MyReceiver()
// onCreate - onDestroy, onResume - onPause depends on you override fun onStart() { super.onStart() registerReceiver(connection, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) } override fun onStop() { super.onStop() // remember unregister to avoid leak unregisterReceiver(connection) }
UPDATE 2
CONNECTIVITY_ACTION
Diese Konstante wurde in API - Ebene veraltet 28. apps die vielseitiger verwenden solltenrequestNetwork(NetworkRequest, PendingIntent)
,registerNetworkCallback(NetworkRequest, PendingIntent)
oderregisterDefaultNetworkCallback(ConnectivityManager.NetworkCallback)
stattdessen die Funktionen für eine schnellere und detailliertere Updates über das Netzwerk ändert , was sie interessiert.weil es
added in API level 22
so oben Code funktioniert auf allen Versionen von Android gutquelle
Der fehlende Teil aller Antworten erinnert Sie daran, sich für diese Aktion zu registrieren:
IntentFilter filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); registerReceiver(your_receiver, filter);
quelle
Ich verwende Broadcast, um die Verbindung jedes Mal zu überprüfen. Erstellen Sie eine Klasse für Verbindungsinformationen.
import android.content.Context; import android.content.ContextWrapper; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class ConnectivityStatus extends ContextWrapper{ public ConnectivityStatus(Context base) { super(base); } public static boolean isConnected(Context context){ ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo connection = manager.getActiveNetworkInfo(); if (connection != null && connection.isConnectedOrConnecting()){ return true; } return false; } }
Wenden Sie Code in Ihre Aktivität an:
private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(!ConnectivityStatus.isConnected(getContext())){ // no connection }else { // connected } } };
Registrieren Sie die Sendung in der
onCreate()
Methode Ihrer Aktivität :@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); .. ... .... }
Vergessen Sie nicht, sich im Aktivitätszyklus abzumelden / zu registrieren:
@Override protected void onResume() { super.onResume(); your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } @Override protected void onPause() { super.onPause(); your_activity_context.unregisterReceiver(receiver); }
quelle
ConnectivityManager.CONNECTIVITY_ACTION
ist jetzt veraltet.Dieser Code funktioniert (in allen Versionen), da die Manifestregistrierung für Geräte ab 7 (API 25 und höher) nicht funktioniert. Siehe diesen Link .
private void foo(){ registerReceiver(connectionBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } private BroadcastReceiver connectionBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent == null || intent.getExtras() == null) return; ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) { // connected } } };
quelle
foo()
Methode ist und wo / wie ich sie anwenden soll? Vielen Dank.onResume
und hebt die Registrierung aufonPause
Weiter miau mwo's Antwort
Sie können den Empfänger aktivieren / deaktivieren, indem Sie:
aktivieren
ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class); PackageManager pm = this.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT).show(); }
deaktivieren
ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class); PackageManager pm = this.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); Toast.makeText(this, "Enabled broadcast receiver", Toast.LENGTH_SHORT).show(); }
Dabei kann dasselbe in einem Intent oder in onCreate aufgerufen werden
quelle
NetworkInfo.isConnected()
ist eine unzuverlässige Methode zum Testen des Internetstatus. Sie gibt true zurück, wenn eine Netzwerkverbindung besteht, obwohl sie möglicherweise keinen Internetzugang hat (z. B. WLAN ohne Internet). Ein zuverlässigerer Ansatz wäre die Verwendungping
mitCONNECTIVITY_ACTION
BroadcastReceiver
:private void registerInternetReceiver() { if (this.internetReceiver != null) return; this.internetReceiver = new BroadcastReceiver() { @Override public void onReceive (Context context, Intent intent) { if (isInternetAvailable()) Log.i ("Tag", "internet status online"); else Log.i ("Tag", "internet status offline"); } }; IntentFilter filter = new IntentFilter(); filter.addAction (ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver (internetReceiver, filter); } private boolean isInternetAvailable() { try { return (Runtime.getRuntime().exec ("ping -c 1 google.com").waitFor() == 0); } catch (Exception ex) { ex.printStackTrace(); } return false; }
quelle
**Also worked on above Android 7.0** // AndroidManifest.xml <service android:name=".NetworkSchedulerService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE"/> // MyApplication.java import android.app.Application; import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; public class MyApplication extends Application { private static Context context; public static Context getContext() { return context; } public static final String TAG = MyApplication.class.getSimpleName(); private static MyApplication mInstance; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); mInstance = this; scheduleJob(); } public static synchronized MyApplication getInstance() { return mInstance; } private void scheduleJob() { JobInfo myJob = new JobInfo.Builder(0, new ComponentName(this, NetworkSchedulerService.class)) .setRequiresCharging(true) .setMinimumLatency(1000) .setOverrideDeadline(2000) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setPersisted(true) .build(); JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); assert jobScheduler != null; jobScheduler.schedule(myJob); } } // Constants.java public class Constants { public static final String CONNECT_TO_WIFI = "WIFI"; public static final String CONNECT_TO_MOBILE = "MOBILE"; public static final String NOT_CONNECT = "NOT_CONNECT"; public final static String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; } // LiveConnectivityReceiver.java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class LiveConnectivityReceiver extends BroadcastReceiver { private MConnectivityReceiver mConnectivityReceiver; LiveConnectivityReceiver(MConnectivityReceiver listener) { mConnectivityReceiver = listener; } @Override public void onReceive(Context context, Intent intent) { mConnectivityReceiver.onNetworkConnectionChanged(isConnected(context)); } public static boolean isConnected(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); assert cm != null; NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } public interface MConnectivityReceiver { void onNetworkConnectionChanged(boolean isConnected); } } // MainActivity.java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private BroadcastReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStop() { stopService(new Intent(this, NetworkSchedulerService.class)); super.onStop(); } @Override protected void onStart() { super.onStart(); startService( new Intent(this, NetworkSchedulerService.class)); } @Override protected void onPause() { super.onPause(); this.unregisterReceiver(this.mReceiver); } @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter("android.intent.action.MAIN"); mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean isConnection = intent.getBooleanExtra("VALUE", false); if (!isConnection) { Toast.makeText(context, "No Internet Connection", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "Back to online", Toast.LENGTH_SHORT).show(); } } }; this.registerReceiver(mReceiver, intentFilter); } } // NetworkSchedulerService.java import android.app.job.JobParameters; import android.app.job.JobService; import android.content.Intent; import android.content.IntentFilter; public class NetworkSchedulerService extends JobService implements LiveConnectivityReceiver.ConnectivityReceiverListener { private LiveConnectivityReceiver mLiveConnectivityReceiver; @Override public void onCreate() { super.onCreate(); mLiveConnectivityReceiver = new LiveConnectivityReceiver(this); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_NOT_STICKY; } @Override public boolean onStartJob(JobParameters params) { registerReceiver(mLiveConnectivityReceiver, new IntentFilter(Constants.CONNECTIVITY_ACTION)); return true; } @Override public boolean onStopJob(JobParameters params) { unregisterReceiver(mLiveConnectivityReceiver); return true; } @Override public void onNetworkConnectionChanged(boolean isConnected) { Intent broadcastedIntent=new Intent("android.intent.action.MAIN"); broadcastedIntent.putExtra("VALUE", isConnected); sendBroadcast(broadcastedIntent); } }
quelle
Unter Android 7 ++ funktioniert die Antwort von @ fedj nicht, aber Sie können den Rundfunkempfänger programmgesteuert registrieren.
quelle
Ich würde die für nougat + aktualisierten Dokumente lesen, da die Absicht aufgrund der Anzahl der Geräte veraltet ist und Netzwerkinformationen allein nicht ausreichen. Ich würde dort Befehle und Variablen des Konnektivitätsmanagers (Konnektivitätsaktion, dort Variablen hinzufügen) verwenden, da sich die meisten allein im letzten Jahr geändert haben. Aktivieren Sie zum Testen die immer aktiven Zelldaten, die ausführliche Protokollierung und die aggressive Übergabe und verwenden Sie bei Bedarf den WLAN-Filter ::
https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION
quelle
** Sie können diese Codezeile in die Hilfsmethoden einfügen und aufrufen, wenn Sie die Internetverbindung überprüfen möchten **
public static class InternetState { static ConnectivityManager cm; static public boolean isConnected(Context context) { try { cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } catch (NullPointerException e) { } NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); return isConnected; } }
quelle