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


    一、需求描述

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

    二、网络是否连接

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

    1. @SuppressLint("MissingPermission")
    2. fun isOnline(context: Context?): Boolean {
    3. if (context == null) {
    4. return false
    5. }
    6. val connectivityManager = context
    7. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    8. val activeNetwork = connectivityManager.activeNetwork ?: return false
    9. val networkCapabilities =
    10. connectivityManager.getNetworkCapabilities(activeNetwork)
    11. if (networkCapabilities != null) {
    12. return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
    13. }
    14. return false
    15. }

    三、动态监听网络

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

    第一步:设置网络类型

    1. public enum NetworkStatus {
    2. NONE(-1, "no"),
    3. MOBILE(0, "mobile"),
    4. WIFI(1, "wifi");
    5. private int status;
    6. private String desc;
    7. NetworkStatus(int code, String msg) {
    8. this.status = code;
    9. this.desc = msg;
    10. }
    11. public int getStatus() {
    12. return status;
    13. }
    14. public String getDesc() {
    15. return desc;
    16. }
    17. @Override
    18. public String toString() {
    19. return "NetwordStatus{" +
    20. "status=" + status +
    21. ", desc='" + desc + '\'' +
    22. "} " + super.toString();
    23. }
    24. }

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

    1. class NetworkBroadcastReceiver : BroadcastReceiver() {
    2. private val TAG = "NetworkBroadcastReceiver"
    3. private var mBroadcastCallback: NetworkBroadcastCallback? = null
    4. override fun onReceive(context: Context, intent: Intent) {
    5. if (intent.action == null) {
    6. return
    7. }
    8. if (TextUtils.equals(intent.action, ConnectivityManager.CONNECTIVITY_ACTION)) {
    9. val isOnline = NetworkUtils.isOnline(context)
    10. val networkStatus = NetworkUtils.getNetWorkState(context)
    11. if (mBroadcastCallback != null) {
    12. mBroadcastCallback!!.onNetworkBroadcastCallback(isOnline, networkStatus)
    13. }
    14. }
    15. }
    16. interface NetworkBroadcastCallback {
    17. fun onNetworkBroadcastCallback(
    18. isConnected: Boolean,
    19. networkStatus: NetworkStatus?
    20. )
    21. }
    22. }

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

    1. import android.annotation.SuppressLint
    2. import android.content.Context
    3. import android.net.ConnectivityManager
    4. import android.net.ConnectivityManager.NetworkCallback
    5. import android.net.Network
    6. import android.net.NetworkCapabilities
    7. import android.os.Build
    8. import com.blankj.utilcode.util.LogUtils
    9. import com.google.android.gms.common.util.CollectionUtils
    10. import com.lixiang.vpn.nuokesasi.delaiwen.NetworkUtils.getNetWorkState
    11. import java.util.concurrent.CopyOnWriteArrayList
    12. @SuppressLint("StaticFieldLeak")
    13. object NetworkListenerHelper {
    14. private const val NET_TAG = "NetworkListenerHelper"
    15. private var mContext: Context? = null
    16. @SuppressLint("StaticFieldLeak")
    17. @Volatile
    18. private var mListenerList: CopyOnWriteArrayList? = null
    19. fun registerNetworkListener() {
    20. val connectivityManager =
    21. mContext!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    22. connectivityManager.registerDefaultNetworkCallback(MyNetworkCallback())
    23. }
    24. private fun notifyAllListeners(
    25. isConnected: Boolean,
    26. networkStatus: NetworkStatus
    27. ) {
    28. if (!CollectionUtils.isEmpty(mListenerList)) {
    29. for (listener in mListenerList!!) {
    30. listener?.onNetworkConnected(isConnected, networkStatus)
    31. }
    32. }
    33. }
    34. @Synchronized
    35. fun addListener(listener: NetworkConnectedListener?) {
    36. if (listener == null) {
    37. return
    38. }
    39. if (mListenerList == null) {
    40. mListenerList = CopyOnWriteArrayList()
    41. }
    42. // 防止重复添加
    43. if (!mListenerList!!.contains(listener)) {
    44. mListenerList!!.add(listener)
    45. }
    46. }
    47. @Synchronized
    48. fun removeListener(listener: NetworkConnectedListener?) {
    49. if (listener != null && !CollectionUtils.isEmpty(mListenerList)) {
    50. mListenerList!!.remove(listener)
    51. }
    52. }
    53. fun unregisterNetworkCallback() {
    54. if (mContext == null) {
    55. return
    56. }
    57. val connectivityManager = mContext!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    58. connectivityManager.unregisterNetworkCallback(NetworkCallback())
    59. }
    60. interface NetworkConnectedListener {
    61. fun onNetworkConnected(
    62. isConnected: Boolean,
    63. networkStatus: NetworkStatus?
    64. )
    65. }
    66. @SuppressLint("NewApi")
    67. private class MyNetworkCallback : NetworkCallback() {
    68. override fun onAvailable(network: Network) {
    69. super.onAvailable(network)
    70. val netWorkState = getNetWorkState(mContext!!)
    71. notifyAllListeners(true, netWorkState)
    72. }
    73. override fun onLost(network: Network) {
    74. super.onLost(network)
    75. val netWorkState = getNetWorkState(mContext!!)
    76. notifyAllListeners(false, netWorkState)
    77. }
    78. override fun onCapabilitiesChanged(
    79. network: Network,
    80. networkCapabilities: NetworkCapabilities
    81. ) {
    82. super.onCapabilitiesChanged(network, networkCapabilities)
    83. if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
    84. when {
    85. networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
    86. }
    87. networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
    88. }
    89. else -> {
    90. }
    91. }
    92. }
    93. }
    94. }
    95. fun init(context: Context): NetworkListenerHelper {
    96. mContext = context
    97. return this
    98. }
    99. }

    第四步:如何使用

    1.在你的application注册监听

     NetworkListenerHelper.init(application).registerNetworkListener()
    

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

            NetworkListenerHelper.addListener(this)
    

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

  • 相关阅读:
    ACM. HJ70 矩阵乘法计算量估算 ●●
    Eclipse MAT解析headp dump,total size小于file size
    4年工作经验,多线程间的5种通信方式都说不出来,你信吗?
    【面试八股总结】Redis数据结构及底层实现
    apt-cache 指令格式以及常用指令
    Git教程1:生成和提交SSH公钥到远程仓库
    点到直线距离
    计算机主机名与用户名区别
    RESTful API,以及如何使用它构建 web 应用程序
    pygame播放视频并实现音视频同步
  • 原文地址:https://blog.csdn.net/LoveFHM/article/details/132761535