• 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方法,这样当网络变化后,就会回调此方法,你就可以进行自己的逻辑处理了。

  • 相关阅读:
    LeetCode 单周赛310 && Acwing周赛68场总结
    C专家编程 第11章 你懂得C,所以C++不再话下 11.1 初识OOP
    【无标题】
    Allegro如何使用快捷键快速切换层面操作指导
    GREASELM: GRAPH REASONING ENHANCED LANGUAGE MODELS FOR QUESTION ANSWERING
    使用 MySQL 实现 Java 版的 hashCode 函数
    程序员都看不懂的代码
    面向对象技术--面向对象开发技术
    Python:函数和代码复用
    英语小作文写作模板及步骤(1)
  • 原文地址:https://blog.csdn.net/LoveFHM/article/details/132761535