Android 网络动态监听和是否联网

一、需求描述

App内部分功能需要动态监听网络,获取网络信息,IP等,此外部分界面的功能需要检测是否联网才可跳转,于是自己总结了下。

二、网络是否连接

这个简单,一个方法就行了

 @SuppressLint("MissingPermission")
    fun isOnline(context: Context?): Boolean {
        if (context == null) {
            return false
        }
        val connectivityManager = context
            .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val activeNetwork = connectivityManager.activeNetwork ?: return false
        val networkCapabilities =
            connectivityManager.getNetworkCapabilities(activeNetwork)
        if (networkCapabilities != null) {
            return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
        }
        return false
    }

三、动态监听网络

原理:因为当手机的网络发生变化时,广播是可以监听到的,所以可以利用这一个特性进行监听,并发送到应用所需要的地方。

第一步:设置网络类型

public enum NetworkStatus {

    NONE(-1, "no"),
   
    MOBILE(0, "mobile"),
    
    WIFI(1, "wifi");

    private int status;
    private String desc;

    NetworkStatus(int code, String msg) {
        this.status = code;
        this.desc = msg;
    }

    public int getStatus() {
        return status;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "NetwordStatus{" +
                "status=" + status +
                ", desc='" + desc + '\'' +
                "} " + super.toString();
    }
}

第二步 新建一个广播,监听到网络变化后,发送消息

class NetworkBroadcastReceiver : BroadcastReceiver() {
    private val TAG = "NetworkBroadcastReceiver"
    private var mBroadcastCallback: NetworkBroadcastCallback? = null
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == null) {
            return
        }
        if (TextUtils.equals(intent.action, ConnectivityManager.CONNECTIVITY_ACTION)) {
            val isOnline = NetworkUtils.isOnline(context)
            val networkStatus = NetworkUtils.getNetWorkState(context)
            if (mBroadcastCallback != null) {
                mBroadcastCallback!!.onNetworkBroadcastCallback(isOnline, networkStatus)
            }
        }
    }


    interface NetworkBroadcastCallback {

        fun onNetworkBroadcastCallback(
            isConnected: Boolean,
            networkStatus: NetworkStatus?
        )
    }
}

第三步:新建网络监听工具类

import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback
import android.net.Network
import android.net.NetworkCapabilities
import android.os.Build
import com.blankj.utilcode.util.LogUtils
import com.google.android.gms.common.util.CollectionUtils
import com.lixiang.vpn.nuokesasi.delaiwen.NetworkUtils.getNetWorkState
import java.util.concurrent.CopyOnWriteArrayList


@SuppressLint("StaticFieldLeak")
object NetworkListenerHelper {
    private const val NET_TAG = "NetworkListenerHelper"
    private var mContext: Context? = null

    @SuppressLint("StaticFieldLeak")
    @Volatile
    private var mListenerList: CopyOnWriteArrayList<NetworkConnectedListener>? = null
    fun registerNetworkListener() {
        val connectivityManager =
            mContext!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        connectivityManager.registerDefaultNetworkCallback(MyNetworkCallback())
    }


    private fun notifyAllListeners(
        isConnected: Boolean,
        networkStatus: NetworkStatus
    ) {
        if (!CollectionUtils.isEmpty(mListenerList)) {
            for (listener in mListenerList!!) {
                listener?.onNetworkConnected(isConnected, networkStatus)
            }
        }
    }


    @Synchronized
    fun addListener(listener: NetworkConnectedListener?) {
        if (listener == null) {
            return
        }
        if (mListenerList == null) {
            mListenerList = CopyOnWriteArrayList()
        }
        // 防止重复添加
        if (!mListenerList!!.contains(listener)) {
            mListenerList!!.add(listener)
        }
    }


    @Synchronized
    fun removeListener(listener: NetworkConnectedListener?) {
        if (listener != null && !CollectionUtils.isEmpty(mListenerList)) {
            mListenerList!!.remove(listener)
        }
    }

    fun unregisterNetworkCallback() {
        if (mContext == null) {
            return
        }
        val connectivityManager = mContext!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        connectivityManager.unregisterNetworkCallback(NetworkCallback())
    }

    interface NetworkConnectedListener {
        fun onNetworkConnected(
            isConnected: Boolean,
            networkStatus: NetworkStatus?
        )
    }

    @SuppressLint("NewApi")
    private class MyNetworkCallback : NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            val netWorkState = getNetWorkState(mContext!!)
            notifyAllListeners(true, netWorkState)
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            val netWorkState = getNetWorkState(mContext!!)
            notifyAllListeners(false, netWorkState)
        }

        override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
        ) {
            super.onCapabilitiesChanged(network, networkCapabilities)
            if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
                when {
                    networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                    }
                    networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                    }
                    else -> {
                    }
                }
            }
        }
    }

    fun init(context: Context): NetworkListenerHelper {
        mContext = context
        return this
    }
}

第四步:如何使用

1.在你的application注册监听

 NetworkListenerHelper.init(application).registerNetworkListener()

2.在你的BaseActivity里面增加监听

        NetworkListenerHelper.addListener(this)

3.使你的BaseActivity继承NetworkListenerHelper.NetworkConnectedListener并重写onNetworkConnected方法,这样当网络变化后,就会回调此方法,你就可以进行自己的逻辑处理了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android动态注册监听网络变化的方式是通过创建BroadcastReceiver来实现,然后在Manifest文件中添加相应的权限和声明。以下是一个简单的示例: 1. 创建BroadcastReceiver类 ``` public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (isNetworkAvailable(context)) { // 网络连接可用 } else { // 网络连接不可用 } } private boolean isNetworkAvailable(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } } ``` 2. 在Manifest中声明相应的权限和BroadcastReceiver ``` <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <receiver android:name=".NetworkChangeReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> ``` 3. 在Activity中注册BroadcastReceiver ``` private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 动态注册BroadcastReceiver IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); // 注销BroadcastReceiver unregisterReceiver(networkChangeReceiver); } ``` 但是需要注意的是,如果使用动态注册方式监听网络变化,需要在Activity的onDestroy方法中注销BroadcastReceiver,否则会导致内存泄漏。 如果出现异常,可以先检查是否添加了相应的权限和声明,并且是否正确注册和注销BroadcastReceiver。另外,也可以尝试使用静态注册的方式来监听网络变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&岁月不待人&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值