Android Check your internet connection using broadcast

I would like to implement a broadcast receiver to check my internet connection. If there is no connection, just end (); It. But I still messed up the context. Please check my codes below.

/** * This broadcast receiver is awoken after boot and registers the service that * checks for new photos from all the known contacts. */ public class ConnectionDetector extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,false); if(noConnectivity){ ((Activity)context).finish(); //Show Warning Message //Close Application the way i suggested } } } 

AndroidManifest

  <receiver android:name=".ConnectionDetector" android:label="NetworkConnection"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> 

LogCat:

 11-01 22:40:29.179: E/AndroidRuntime(29531): FATAL EXCEPTION: main 11-01 22:40:29.179: E/AndroidRuntime(29531): java.lang.RuntimeException: Unable to start receiver in.wptrafficanalyzer.actionbarsherlocknavtab.ConnectionDetector: java.lang.ClassCastException: android.app.ReceiverRestrictedContext 11-01 22:40:29.179: E/AndroidRuntime(29531): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1809) 11-01 22:40:29.179: E/AndroidRuntime(29531): at android.app.ActivityThread.access$2400(ActivityThread.java:117) 11-01 22:40:29.179: E/AndroidRuntime(29531): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985) 11-01 22:40:29.179: E/AndroidRuntime(29531): at android.os.Handler.dispatchMessage(Handler.java:99) 11-01 22:40:29.179: E/AndroidRuntime(29531): at android.os.Looper.loop(Looper.java:130) 11-01 22:40:29.179: E/AndroidRuntime(29531): at android.app.ActivityThread.main(ActivityThread.java:3691) 11-01 22:40:29.179: E/AndroidRuntime(29531): at java.lang.reflect.Method.invokeNative(Native Method) 11-01 22:40:29.179: E/AndroidRuntime(29531): at java.lang.reflect.Method.invoke(Method.java:507) 11-01 22:40:29.179: E/AndroidRuntime(29531): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 11-01 22:40:29.179: E/AndroidRuntime(29531): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 11-01 22:40:29.179: E/AndroidRuntime(29531): at dalvik.system.NativeStart.main(Native Method) 11-01 22:40:29.179: E/AndroidRuntime(29531): Caused by: java.lang.ClassCastException: android.app.ReceiverRestrictedContext 11-01 22:40:29.179: E/AndroidRuntime(29531): at in.wptrafficanalyzer.actionbarsherlocknavtab.ConnectionDetector.onReceive(ConnectionDetector.java:29) 11-01 22:40:29.179: E/AndroidRuntime(29531): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1798) 11-01 22:40:29.179: E/AndroidRuntime(29531): ... 10 more 
+4
source share
1 answer

The context you get in BroadcastReciever is not activity. BroadcastReciever works out of activity and is not tied to one unless you do it.

Putting aside bad practice, just to finish work on an Internet problem without notifying the user, you can do the following:

 public abstract class ConnectionAwareActivity extends Activity { protected final IntentFilter mIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); // A filter for a BR. We want to listen to internet changes protected final ConnectionDetector mConnectionDetector = new ConnectionDetector(); // Creating an instance of our BR for activity to use @Override protected void onResume() { super.onResume(); try { registerReceiver(mConnectionDetector, mIntentFilter); // Activity gets shown, we register a BR and it starts to receive notifications about internet changes } catch (Exception exc) { // whoops } } @Override protected void onPause() { super.onPause(); try { unregisterReceiver(mConnectionDetector); // Try to unregister BR, since when activity is not visible to user, we don't want to perform any operations on internet change } catch (Exception exc) { // whoops } } // Your BR that is encapsulated in Activity and therefore has access to it methods, since it has access to Activity instance protected class ConnectionDetector extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); if (noConnectivity) { finish(); } } } 

}

Use it as a superclass for your other actions (it extends from Activity, changes it to any), which should be interrupted during connection errors.

This is a very simple option and somewhat incorrect, since you prefer composition over superclasses.

+7
source

Source: https://habr.com/ru/post/1443460/


All Articles