简体   繁体   中英

Constantly checking for connectivity

How can I make something in my Java constantly check for connectivity of internet I already have something that checks for connectivity of internet but do not know how to make it constant

Current connectivity checker

public static boolean isNetworkAvailable(Context context) {
 
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 
        if (connectivityManager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
                return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
            } else {
                NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
                return activeNetwork != null && activeNetwork.isConnected();
 
            }
        }
 
        return false;
    }]

I have done it in Kotlin. If you face problem in converting Kotlin into Java you can ask me for help.

So, I am using Broadcast Receiver and detect whenever the network state changed and when there is no Internet, a dialogBox will show.

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private var br: BroadcastReceiver? = null
    private var filter: IntentFilter? = null
    private var mContext: MainActivity? = null
    private var isPaused = false
    private var toConfirm = true
    private var noInternetBuilder: AlertDialog.Builder? = null
    private var noInternetDialog: AlertDialog? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        br = MyBroadCastReceiver()
        filter = IntentFilter()
        filter?.addAction("android.net.conn.CONNECTIVITY_CHANGE")
        mContext = this@MainActivity
        mContext?.registerReceiver(br, filter)
    }

    /**
     * Broadcast for Internet Checking
     *
     */
    inner class MyBroadCastReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            if (!isNetworkStatusAvailable(this@MainActivity)) {
                if (!isPaused) {
                    toConfirm = true
                    if (noInternetDialog != null) {
                        noInternetDialog?.dismiss()
                    }
                    showDialogNoInternet(this@MainActivity)
                }
                toConfirm = false
            } else {
                toConfirm = true
                if (noInternetDialog != null) {
                    if (noInternetDialog!!.isShowing) {
                        noInternetDialog?.dismiss()
                    }
                }
            }
        }
    }

    fun isNetworkStatusAvailable(context: Context): Boolean {
        var result = false
        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val networkCapabilities = connectivityManager.activeNetwork ?: return false
            val actNw =
                connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
            result = when {
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
                else -> false
            }
        } else {
            @Suppress("DEPRECATION")
            connectivityManager.run {
                connectivityManager.activeNetworkInfo?.run {
                    result = when (type) {
                        ConnectivityManager.TYPE_WIFI -> true
                        ConnectivityManager.TYPE_MOBILE -> true
                        ConnectivityManager.TYPE_ETHERNET -> true
                        else -> false
                    }

                }
            }
        }
        return result
    }

    fun showDialogNoInternet(activity: Activity) {
    noInternetBuilder = AlertDialog.Builder(activity)
    val viewGroup = findViewById<ViewGroup>(android.R.id.content)
    val dialogView: View = LayoutInflater.from(viewGroup.context)
        .inflate(R.layout.dialog_nointernet, viewGroup, false)
    noInternetBuilder!!.setView(dialogView)
    noInternetDialog = noInternetBuilder!!.create()
    noInternetDialog!!.setCancelable(false)
    noInternetDialog!!.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    val btn = dialogView.findViewById<View>(R.id.btnOkInternet) as Button
    btn.setOnClickListener {
        resultInternetLauncher.launch(Intent(Settings.ACTION_WIFI_SETTINGS))
        noInternetDialog?.dismiss()
    }
    noInternetDialog!!.show()
}

    override fun onPause() {
        super.onPause()
        isPaused = true
    }

    override fun onResume() {
        super.onResume()
        isPaused = false
        if (!toConfirm) {
            if (noInternetDialog != null) {
                noInternetDialog?.dismiss()
            }
            showDialogNoInternet(mContext!!)
        }
    }
}

Must implement override fun onPause() and override fun onResume() along with it because it will control the crashes of dialogBox.

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