Gibt es ein Android Intent ACTION_XXX
, das mich benachrichtigt, wenn eine Internetverbindung verfügbar ist?
Ich möchte eine BroadcastReceiver
instanziieren, die meine Anwendung benachrichtigt, wenn ein Benutzer die Internetverbindung aktiviert (per WLAN, per GSM usw.).
Könnte mir jemand helfen?
<receiver Android:name=".YOURRECEIVER">
<intent-filter>
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
Die akzeptierte Antwort ist korrekt. 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");
}
}
}
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");
}
}
}
}
MyReceiver.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" />
UPDATE
Wenn Ihre App auf API-Level 26 oder höher ausgerichtet ist, können Sie im Manifest keinen Empfänger für implizite Broadcasts deklarieren (Broadcasts, die nicht speziell auf Ihre App ausgerichtet sind), mit Ausnahme einiger impliziter Broadcasts, die von dieser Einschränkung ausgenommen sind. In den meisten Fällen können Sie stattdessen geplante Jobs verwenden.
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)
}
PDATE 2
CONNECTIVITY_ACTION
Diese Konstante wurde in API Level 28 nicht mehr empfohlen. Apps sollten die vielseitigeren Funktionen requestNetwork(NetworkRequest, PendingIntent)
, registerNetworkCallback(NetworkRequest, PendingIntent)
oder registerDefaultNetworkCallback(ConnectivityManager.NetworkCallback)
verwenden, um schneller und besser zu sein Detaillierte Aktualisierungen zu den Netzwerkänderungen, die sie betreffen.
weil es added in API level 22
ist, funktioniert der obige Code auf allen Android-Versionen
Der fehlende Teil aller Antworten ist eine Erinnerung an die Registrierung für diese Aktion:
IntentFilter filter = new IntentFilter();
filter.addAction("Android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(your_receiver, filter);
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 zu registrieren/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);
}
Dieser Code funktioniert (in allen Versionen), da die Manifestregistrierung für 7+ (API 25 und höher) -Geräte nicht funktioniert, siehe 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
}
}
};
Fortsetzung der Meow 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();
}
wo kann dasselbe in einem Intent oder in onCreate aufgerufen werden
NetworkInfo.isConnected()
ist eine unzuverlässige Methode, um den Internetstatus zu testen. Wenn eine Netzwerkverbindung besteht, wird sie als wahr zurückgegeben, obwohl sie möglicherweise keinen Internetzugang hat (z. B. WLAN ohne Internetverbindung). Ein zuverlässigerer Ansatz wäre die Verwendung von ping
mit einem CONNECTIVITY_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;
}
**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);
}
}
Apps, die auf Android 7.0 (API-Ebene 24) und höher ausgerichtet sind, erhalten keine CONNECTIVITY_ACTION-Broadcasts, wenn sie den Broadcast-Empfänger deklarieren in ihrem Manifest Apps erhalten weiterhin CONNECTIVITY_ACTION Broadcasts, wenn sie ihren BroadcastReceiver mit .__ registrieren. Context.registerReceiver () und dieser Kontext ist noch gültig.
Ich würde die für nougat + aktualisierten Dokumente lesen, da die Absicht aufgrund der Anzahl der Geräte nicht mehr empfohlen wird, die Netzwerkinformationen allein nicht ausreichen. Ich würde Konnektivitätsmanager (Konnektivitätsaktion verwenden, dort Variablen hinzufügen) und dort Befehle verwenden, da sich die meisten Änderungen allein im letzten Jahr vorgenommen haben. Aktivieren Sie zum Testen Zelldaten immer aktiv, ausführliche Protokollierung und aggressives Handover. Verwenden Sie ggf. WLAN-Filter :
https://developer.Android.com/reference/Android/net/ConnectivityManager.html#CONNECTIVITY_ACTION