Search code examples
androidandroid-activitybroadcastreceiveractivity-finish

How to finish an Android activity from separate Broadcast receiver class


I have an activity class MediaPlayerDemo_Audio and one broadcast receiver class ConnectivityChangeReceiver which extends BroadcastReceiver.

I want to finish an activity MediaPlayerDemo_Audio when network connection lost.

Any idea? Thanks.

ConnectivityChangeReceiver.java

public class ConnectivityChangeReceiver extends BroadcastReceiver {

@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE );
    /* Check wi-fi network availability */
    NetworkInfo activeWifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    boolean isConnectedToWifi = activeWifiInfo != null && activeWifiInfo.isConnectedOrConnecting();
    /* Check mobile network availability */
    NetworkInfo activeMobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    boolean isConnectedToMobileData = activeMobileInfo != null && activeMobileInfo.isConnectedOrConnecting();

    if(isConnectedToWifi){
        //Toast.makeText(context, "Connected to wifi!", Toast.LENGTH_LONG).show();
    }else{
        if(isConnectedToMobileData){
            //Toast.makeText(context, "Connected to Mobile data!", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context, "No internet connection!", Toast.LENGTH_LONG).show();
            /* Here I want to finish that activity */
        }
    }       
}}

Androidmanifest.xml Class ConnectivityChangeReceiver will be running in background and It will keep checking network connectivity, this class will be called from this receiver.

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

I referred this answer but It could not help. Because one class cannot extend multiple classes. I mean, MediaPlayerDemo_Audio class cannot extend Activity as well as BroadcastReceiver class and vice versa.


Solution

  • As per the example, it doesn't need to extend the both the classes. Just create broadcast receiver inside your activity and one thing, you need to do is register the receiver in onResume() and unregister it on onPause().

    Below is example:-

    public class MyPreferenceActivity extends Activity {
    
    //Your stuff inside the activity
    
    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(receiver, intentFilter);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }
    
    ConnectivityChangeReceiver receiver = new ConnectivityChangeReceiver();
    
    public class ConnectivityChangeReceiver extends BroadcastReceiver {
    
        @SuppressWarnings("deprecation")
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    /* Check wi-fi network availability */
            NetworkInfo activeWifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            boolean isConnectedToWifi = activeWifiInfo != null && activeWifiInfo.isConnectedOrConnecting();
    /* Check mobile network availability */
            NetworkInfo activeMobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            boolean isConnectedToMobileData = activeMobileInfo != null && activeMobileInfo.isConnectedOrConnecting();
    
            if (isConnectedToWifi) {
                //Toast.makeText(context, "Connected to wifi!", Toast.LENGTH_LONG).show();
            } else {
                if (isConnectedToMobileData) {
                    //Toast.makeText(context, "Connected to Mobile data!", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(context, "No internet connection!", Toast.LENGTH_LONG).show();
            /* Here I want to finish that activity */
                }
            }
        }
    }
    }