简体   繁体   中英

How to achieve dialogue box get disappeared when internet or WiFi get connected. and vice versa?

I build the dialogue box for my android app. Its working well, but i encountered some issues related to the dialogue box.

(1) I want when internet connection or WiFi get connected. automatically dialogue box get disappeared.

(2) In middle of the app is running if internet connection get lost. dialogue box again appears automatically.

if (!isConnected(Dashboard.this)) buildDialog(Dashboard.this).show();
        else {
            setContentView(R.layout.activity_dashboard);
        }
 public boolean isConnected(Context context) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netinfo = cm.getActiveNetworkInfo();

        if (netinfo != null && netinfo.isConnectedOrConnecting()) {
            android.net.NetworkInfo wifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            android.net.NetworkInfo mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

            if ((mobile != null && mobile.isConnectedOrConnecting()) || (wifi != null && wifi.isConnectedOrConnecting()))
                return true;
            else return false;
        } else
            return false;
    }

    public AlertDialog.Builder buildDialog(Context c) {

        AlertDialog.Builder builder = new AlertDialog.Builder(c);
        builder.setTitle("No Internet Connection");
        builder.setMessage("You need to have Mobile Data or WiFi to access this. Press OK to Exit");
        builder.setCancelable(false);

        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                Dashboard.super.onBackPressed();
            }
        });

        return builder;
    } 

Use properties builder.setCancelable(false); in your aleart dailog

将此行放在警报对话框代码之外

alertDialog.setCancelable(false);

To automatically get internet connectivity events try setting up a network change listener. Here is a sample:

/**
 * Broadcast receiver that detects receives notification when change in internet connection to alert when there is no Internet.
 */

public class NetworkChangeReceiver extends BroadcastReceiver {

    private NetworkChangeListener mListener;

    public NetworkChangeReceiver(NetworkChangeListener listener) {
        mListener = listener;
    }

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

        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();

            boolean connected = activeNetwork != null && activeNetwork.isConnected();
            mListener.onNetworkConnectedStateChanged(connected);
        }
    }

    public interface NetworkChangeListener {
        void onNetworkConnectedStateChanged(boolean connected);
    }
}

You then register the listener in your Activity or Fragment

@Override
    public void onStart() {
        super.onStart();

        if (mNetworkChangeReceiver == null) {
            mNetworkChangeReceiver = new NetworkChangeReceiver(this);
            getContext().registerReceiver(mNetworkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
        }
    }

Then show / dismiss your dialog on network connected state changed

@Override
    public void onNetworkConnectedStateChanged(boolean connected) {
        if (connected) {
            //dismiss dialog
        } else {
            //show dialog
        }
    }

You have to setCancelable == false for stop tounching outside of dialog.

In Your case You have to put like this in your AlertDialog.Builder after setMessage

builder.setCancelable(false);

and Use this functionality for User that on Backpress button You have to setCancelable == true

for that You have to write code in onBackPressed like this :-

builder.setCancelable(true);

You need add Broadcast receiver to get connectivity status.

Then you need to keep builder global.

private AlertDialog.Builder builder;

Just create a BroadcastReceiver to track your internet connectivity

first, create a NetworkChangeReceiver class like this

 public class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                if (isOnline(context)) {
                   //show dialog when internet on
                    dialogHome(true);

                    Log.e("pradeep", "Online Connect Internet ");
                } else {
                  //hide dialog when internet off
                    dialogHome(false);

                    Log.e("pradeep", "Connectivity Failure !!");
                }
            } catch (NullPointerException e) {
                e.printStackTrace();
                Log.i(getClass().getName(), "exceptional " + e.toString());
            }
        }

        public boolean isOnline(Context context) {
            try {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                //should check null because in airplane mode it will be null
                return (netInfo != null && netInfo.isConnected());
            } catch (NullPointerException e) {
                e.printStackTrace();
                return false;
            }
        }
    }

after that just add below code in application tag which is located in AndroidMenifest.xml

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

Final step

just create your BroadcastReceiver instance in your activity where you check the internet activity

    private BroadcastReceiver mNetworkReceiver;

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

         //init broadcast receiver
            mNetworkReceiver = new NetworkChangeReceiver();
        }

  @Override
    protected void onResume() {
        super.onResume();
        if (((NetworkChangeReceiver) mNetworkReceiver).isOnline(mContext)) {
        } else {
            registerNetworkBroadcastForNougat();
        }
    }

 private void registerNetworkBroadcastForNougat() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            try {
                registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
            } catch (Exception e) {
                Log.i(getClass().getName(), "easdfdf" + e.toString());
            }
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
            } catch (Exception e) {
                Log.i(getClass().getName(), "easdfdfdd" + e.toString());
            }
        }
    }

    protected void unregisterNetworkChanges() {
        try {
            unregisterReceiver(mNetworkReceiver);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterNetworkChanges();
    }

whenever internet connection changes BroadcastReceiver call onReceive Method.

Hope helpful for you...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM