当前位置:   article > 正文

Android网络状态变化监听 -- 结合registerNetworkCallback和广播(kotlin)_android监听网络状态变化

android监听网络状态变化

如图

218416259a5147a4971f27e6518401e7.png

 

 

说明
  AndroidAndroid针对网络状态变化的监听,在应用内我们通用需要监听设备网络状态的变化,作出相应的业务处理,需要一个方便的、全局的监听实现。。
  针对不同设备的系统版本,使用不同的API方法实现;
  注意使用广播监听网络状态在高版本的适配问题;

  1、Build.VERSION.SDK_INT >= Build.VERSION_CODES.N,使用connectivityManager.registerDefaultNetworkCallback()方法;
  2、Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP,使用connectivityManager.registerNetworkCallback(networkRequest, new MyNetworkCallback());方法;
  3、其它系统版本使用广播监听;
  4、NetworkListenerHelper可以添加多个页面的监听,当某个页面需要监听网络时,就可以添加到监听者集合中,页面关闭时移除这个监听者,也可以使用事件总线

核心实现

NetworkListenerHelper

  1. package com.let.networkstatusmonitor
  2. import android.annotation.SuppressLint
  3. import android.content.Context
  4. import android.content.IntentFilter
  5. import android.net.ConnectivityManager
  6. import android.net.ConnectivityManager.NetworkCallback
  7. import android.net.Network
  8. import android.net.NetworkCapabilities
  9. import android.net.NetworkRequest
  10. import android.os.Build
  11. import com.let.networkstatusmonitor.NetworkBroadcastReceiver.NetworkBroadcastCallback
  12. import com.let.networkstatusmonitor.NetworkUtils.getNetWorkState
  13. import java.util.concurrent.CopyOnWriteArrayList
  14. /**
  15. * @Author: let
  16. * @date: 2022/11/15 17:29
  17. * @description: 网络状态变化的监听类,根据android不同版本的系统,有 [ConnectivityManager.registerNetworkCallback]和注册广播两种实现方式;
  18. */
  19. object NetworkListenerHelper {
  20. private val TAG = "NetworkListenerHelper"
  21. private var mContext: Context? = null
  22. @Volatile
  23. private var mListenerList: CopyOnWriteArrayList<NetworkConnectedListener>? = null
  24. /**
  25. * 注册网络状态的监听;
  26. */
  27. @SuppressLint("MissingPermission")
  28. fun registerNetworkListener() {
  29. when {
  30. Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
  31. val connectivityManager =
  32. mContext!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  33. if (connectivityManager == null) {
  34. LogUtils.el(
  35. TAG,
  36. "registerNetworkListener#return#connectivityManager=$connectivityManager"
  37. )
  38. return
  39. }
  40. connectivityManager.registerDefaultNetworkCallback(MyNetworkCallback())
  41. }
  42. Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> {
  43. val connectivityManager = mContext
  44. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  45. if (connectivityManager == null) {
  46. LogUtils.el(
  47. TAG,
  48. "registerNetworkListener#return#connectivityManager=$connectivityManager"
  49. )
  50. return
  51. }
  52. val builder: NetworkRequest.Builder
  53. builder = NetworkRequest.Builder()
  54. builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
  55. .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  56. val networkRequest = builder.build()
  57. connectivityManager.registerNetworkCallback(networkRequest, MyNetworkCallback())
  58. }
  59. else -> {
  60. // 通过广播的方式监听网络;
  61. val mNetworkBroadcastReceiver = NetworkBroadcastReceiver()
  62. val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
  63. mContext!!.registerReceiver(mNetworkBroadcastReceiver, filter)
  64. mNetworkBroadcastReceiver.setBroadcastCallback(object : NetworkBroadcastCallback {
  65. override fun onNetworkBroadcastCallback(
  66. isConnected: Boolean,
  67. networkStatus: NetworkStatus?
  68. ) {
  69. //
  70. notifyAllListeners(isConnected, networkStatus!!)
  71. }
  72. })
  73. }
  74. }
  75. }
  76. /**
  77. * 通知所有接收者;
  78. *
  79. * @param isConnected
  80. * @param networkStatus
  81. */
  82. private fun notifyAllListeners(
  83. isConnected: Boolean,
  84. networkStatus: NetworkStatus
  85. ) {
  86. if (CollectionUtils.isNotEmpty(mListenerList)) {
  87. // mListenerList.stream().forEach(networkConnectedListener -> {
  88. // networkConnectedListener.onNetworkConnected(isConnected, networdStatus);
  89. // });
  90. for (listener in mListenerList!!) {
  91. listener?.onNetworkConnected(isConnected, networkStatus)
  92. }
  93. }
  94. }
  95. /**
  96. * 添加回调的监听者;
  97. */
  98. @Synchronized
  99. fun addListener(listener: NetworkConnectedListener?) {
  100. if (listener == null) {
  101. return
  102. }
  103. if (mListenerList == null) {
  104. mListenerList = CopyOnWriteArrayList()
  105. }
  106. // 防止重复添加;
  107. if (!mListenerList!!.contains(listener)) {
  108. mListenerList!!.add(listener)
  109. }
  110. }
  111. /**
  112. * 移除某个回调实例;
  113. *
  114. * @param listener
  115. */
  116. @Synchronized
  117. fun removeListener(listener: NetworkConnectedListener?) {
  118. if (listener != null && CollectionUtils.isNotEmpty(mListenerList)) {
  119. mListenerList!!.remove(listener)
  120. }
  121. }
  122. fun unregisterNetworkCallback() {
  123. if (mContext == null) {
  124. return
  125. }
  126. val connectivityManager = mContext
  127. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  128. if (connectivityManager == null) {
  129. LogUtils.el(
  130. TAG,
  131. "registerNetworkListener#return#connectivityManager=$connectivityManager"
  132. )
  133. return
  134. }
  135. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  136. connectivityManager.unregisterNetworkCallback(NetworkCallback())
  137. }
  138. }
  139. interface NetworkConnectedListener {
  140. /**
  141. * @param isConnected
  142. * @param networkStatus
  143. */
  144. fun onNetworkConnected(
  145. isConnected: Boolean,
  146. networkStatus: NetworkStatus?
  147. )
  148. }
  149. @SuppressLint("NewApi") My
  150. private class MyNetworkCallback : NetworkCallback() {
  151. //当用户与网络连接(或断开连接)(可以是WiFi或蜂窝网络)时,这两个功能均作为默认回调;
  152. override fun onAvailable(network: Network) {
  153. super.onAvailable(network)
  154. LogUtils.d(TAG, "onAvailable#network=$network")
  155. // 需要同步获取一次网络状态;
  156. val netWorkState = getNetWorkState(mContext!!)
  157. LogUtils.d(TAG, "onAvailable#netWorkState=$netWorkState")
  158. //
  159. notifyAllListeners(true, netWorkState)
  160. }
  161. override fun onLost(network: Network) {
  162. super.onLost(network)
  163. LogUtils.d(TAG, "onLost#network=$network")
  164. // 需要同步获取一次网络状态;
  165. val netWorkState = getNetWorkState(mContext!!)
  166. LogUtils.d(TAG, "onLost#netWorkState=$netWorkState")
  167. //
  168. notifyAllListeners(false, netWorkState)
  169. }
  170. override fun onCapabilitiesChanged(
  171. network: Network,
  172. networkCapabilities: NetworkCapabilities
  173. ) {
  174. super.onCapabilitiesChanged(network, networkCapabilities)
  175. LogUtils.d(TAG, "onCapabilitiesChanged#network=$network")
  176. // LogUtils.d(TAG, "onCapabilitiesChanged#network=" + network + ", networkCapabilities=" + networkCapabilities);
  177. // 表示能够和互联网通信(这个为true表示能够上网)
  178. if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
  179. when {
  180. networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
  181. LogUtils.d(TAG, "onCapabilitiesChanged#网络类型为wifi")
  182. }
  183. networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
  184. LogUtils.d(TAG, "onCapabilitiesChanged#蜂窝网络")
  185. }
  186. else -> {
  187. LogUtils.d(TAG, "onCapabilitiesChanged#其他网络")
  188. }
  189. }
  190. }
  191. }
  192. }
  193. fun init(context: Context): NetworkListenerHelper {
  194. mContext = context
  195. return this
  196. }
  197. }

MainActivity

  1. package com.let.networkstatusmonitor
  2. import android.os.Bundle
  3. import android.widget.TextView
  4. import androidx.appcompat.app.AppCompatActivity
  5. import com.let.networkstatusmonitor.NetworkListenerHelper.NetworkConnectedListener
  6. /**
  7. * @Author: let
  8. * @date: 2021/11/15 17:29
  9. * @description:
  10. */
  11. class MainActivity : AppCompatActivity(), NetworkConnectedListener {
  12. private val TAG = "MainActivity"
  13. private var mTvResult: TextView? = null
  14. override fun onCreate(savedInstanceState: Bundle?) {
  15. super.onCreate(savedInstanceState)
  16. setContentView(R.layout.activity_main)
  17. mTvResult = findViewById(R.id.tv_result)
  18. // 网络状态回调;
  19. NetworkListenerHelper.addListener(this@MainActivity)
  20. }
  21. override fun onDestroy() {
  22. super.onDestroy()
  23. NetworkListenerHelper.removeListener(this@MainActivity)
  24. }
  25. override fun onNetworkConnected(isConnected: Boolean, networkStatus: NetworkStatus?) {
  26. LogUtils.d(TAG, "onNetworkConnected#isConnected=$isConnected")
  27. val trim = mTvResult!!.text.toString()
  28. val status = networkStatus.status
  29. val desc = networkStatus.desc
  30. mTvResult!!.post { mTvResult!!.text = "\n网络变化通知:status=$status, desc=$desc\n$trim" }
  31. }
  32. }

NetworkStatus

  1. package com.let.networkstatusmonitor;
  2. /**
  3. * @Author: let
  4. * @date: 2022/11/15 17:30
  5. * @description: 网络连接状态的枚举
  6. */
  7. public enum NetworkStatus {
  8. /**
  9. * ;
  10. */
  11. NONE(-1, "无网络连接"),
  12. /**
  13. * 解析数据内容失败
  14. */
  15. MOBILE(0, "移动网络连接"),
  16. /**
  17. * 网络问题
  18. */
  19. WIFI(1, "WIFI连接");
  20. private int status;
  21. private String desc;
  22. NetworkStatus(int code, String msg) {
  23. this.status = code;
  24. this.desc = msg;
  25. }
  26. public int getStatus() {
  27. return status;
  28. }
  29. public String getDesc() {
  30. return desc;
  31. }
  32. @Override
  33. public String toString() {
  34. return "NetwordStatus{" +
  35. "status=" + status +
  36. ", desc='" + desc + '\'' +
  37. "} " + super.toString();
  38. }
  39. }

NetworkUtils

  1. package com.let.networkstatusmonitor
  2. import android.annotation.SuppressLint
  3. import android.content.Context
  4. import android.net.ConnectivityManager
  5. import android.net.NetworkCapabilities
  6. import android.os.Build
  7. /**
  8. * @Author: let
  9. * @date: 2022/11/15 17:31
  10. * @description:
  11. */
  12. object NetworkUtils {
  13. @JvmStatic
  14. @SuppressLint("MissingPermission")
  15. fun getNetWorkState(context: Context): NetworkStatus {
  16. return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
  17. val connectivityManager =
  18. context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  19. val mobileNetInfo =
  20. connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
  21. val wifiNetInfo =
  22. connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
  23. if (mobileNetInfo != null && mobileNetInfo.isAvailable) {
  24. //WIFI和移动网络均未连接
  25. NetworkStatus.MOBILE
  26. } else if (wifiNetInfo != null && wifiNetInfo.isAvailable) {
  27. //WIFI和移动网络均未连接
  28. NetworkStatus.WIFI
  29. } else {
  30. NetworkStatus.NONE
  31. }
  32. } else {
  33. when {
  34. isMobileConnected(context) -> {
  35. NetworkStatus.MOBILE
  36. }
  37. isWifiConnected(context) -> {
  38. NetworkStatus.WIFI
  39. }
  40. else -> {
  41. NetworkStatus.NONE
  42. }
  43. }
  44. }
  45. // //获取所有网络连接的信息
  46. // Network[] networks = connMgr.getAllNetworks();
  47. // //通过循环将网络信息逐个取出来
  48. // for (int i = 0; i < networks.length; i++) {
  49. // //获取ConnectivityManager对象对应的NetworkInfo对象
  50. // NetworkInfo networkInfo = connMgr.getNetworkInfo(networks[i]);
  51. // if (networkInfo.isConnected()) {
  52. // if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
  53. // return NetwordStatus.WIFI;
  54. // } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
  55. // return NetwordStatus.MOBILE;
  56. // }
  57. // }
  58. // }
  59. }
  60. /**
  61. * 判断网络是否连接
  62. *
  63. * @param context
  64. * @return
  65. */
  66. @SuppressLint("MissingPermission")
  67. fun isOnline(context: Context?): Boolean {
  68. if (context == null) {
  69. return false
  70. }
  71. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
  72. val connMgr =
  73. context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  74. val networkInfo = connMgr.activeNetworkInfo
  75. return networkInfo != null && networkInfo.isAvailable
  76. } else {
  77. val connectivityManager = context
  78. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  79. val activeNetwork = connectivityManager.activeNetwork ?: return false
  80. val networkCapabilities =
  81. connectivityManager.getNetworkCapabilities(activeNetwork)
  82. if (networkCapabilities != null) {
  83. return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
  84. }
  85. }
  86. return false
  87. }
  88. @SuppressLint("MissingPermission")
  89. fun isWifiConnected(context: Context?): Boolean {
  90. if (context == null) {
  91. return false
  92. }
  93. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
  94. val connectivityManager = context
  95. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  96. val networkInfo = connectivityManager
  97. .getNetworkInfo(ConnectivityManager.TYPE_WIFI)
  98. if (networkInfo != null) {
  99. return networkInfo.isAvailable
  100. }
  101. } else {
  102. val connectivityManager = context
  103. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  104. val activeNetwork = connectivityManager.activeNetwork ?: return false
  105. val networkCapabilities =
  106. connectivityManager.getNetworkCapabilities(activeNetwork)
  107. if (networkCapabilities != null) {
  108. return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
  109. }
  110. }
  111. return false
  112. }
  113. @SuppressLint("MissingPermission")
  114. fun isMobileConnected(context: Context?): Boolean {
  115. if (context == null) {
  116. return false
  117. }
  118. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
  119. val connectivityManager = context
  120. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  121. val networkInfo = connectivityManager
  122. .getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
  123. if (networkInfo != null) {
  124. return networkInfo.isAvailable
  125. }
  126. } else {
  127. val connectivityManager = context
  128. .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
  129. val activeNetwork = connectivityManager.activeNetwork ?: return false
  130. val networkCapabilities =
  131. connectivityManager.getNetworkCapabilities(activeNetwork)
  132. if (networkCapabilities != null) {
  133. return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
  134. }
  135. }
  136. return false
  137. }
  138. }
NetworkBroadcastReceiver
  1. package com.let.networkstatusmonitor
  2. import android.content.BroadcastReceiver
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.net.ConnectivityManager
  6. import android.text.TextUtils
  7. /**
  8. * @Author: let
  9. * @date: 2021/11/15 17:28
  10. * @description: 网络状态的监听广播
  11. */
  12. class NetworkBroadcastReceiver : BroadcastReceiver() {
  13. private val TAG = "NetworkBroadcastReceiver"
  14. private var mBroadcastCallback: NetworkBroadcastCallback? = null
  15. override fun onReceive(context: Context, intent: Intent) {
  16. if (intent.action == null) {
  17. LogUtils.el(TAG, "onReceive#intent=$intent")
  18. return
  19. }
  20. val action = intent.action
  21. LogUtils.d(TAG, "onReceive#action=$action")
  22. if (TextUtils.equals(intent.action, ConnectivityManager.CONNECTIVITY_ACTION)) {
  23. // 申请权限;
  24. // if (!XXPermissions.isGrantedPermission(context, Permission.WRITE_EXTacERNAL_STORAGE,
  25. // Permission.READ_EXTERNAL_STORAGE)) {
  26. // }
  27. // NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
  28. // NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  29. // if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
  30. // //WIFI和移动网络均未连接
  31. // netContentListener.netContent(false);
  32. // } else {
  33. // //WIFI连接或者移动网络连接
  34. // netContentListener.netContent(true);
  35. // }
  36. val isOnline = NetworkUtils.isOnline(context)
  37. val networkStatus = NetworkUtils.getNetWorkState(context)
  38. LogUtils.d(TAG, "onReceive#isOnline=$isOnline, networdStatus=$networkStatus")
  39. if (mBroadcastCallback != null) {
  40. mBroadcastCallback!!.onNetworkBroadcastCallback(isOnline, networkStatus)
  41. }
  42. }
  43. }
  44. fun setBroadcastCallback(broadcastCallback: NetworkBroadcastCallback?) {
  45. mBroadcastCallback = broadcastCallback
  46. }
  47. interface NetworkBroadcastCallback {
  48. /**
  49. * 根据监听的结果返回连接状态和网络状态;
  50. *
  51. * @param isConnected
  52. * @param networkStatus
  53. */
  54. fun onNetworkBroadcastCallback(
  55. isConnected: Boolean,
  56. networkStatus: NetworkStatus?
  57. )
  58. }
  59. }

ApplicationSupporter

  1. package com.let.networkstatusmonitor
  2. import android.app.Application
  3. /**
  4. * @Author: let
  5. * @date: 2022/11/15 17:28
  6. * @description:
  7. */
  8. class ApplicationSupporter : Application() {
  9. private val TAG = "ApplicationSupporter"
  10. override fun onCreate() {
  11. super.onCreate()
  12. instance = this
  13. BaseApplicationHelper.getInstance()
  14. .initApplicationContext(this)
  15. // 注册网络状态监听;
  16. NetworkListenerHelper.init(this).registerNetworkListener()
  17. }
  18. companion object {
  19. var instance: ApplicationSupporter? = null
  20. }
  21. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/267004
推荐阅读
相关标签
  

闽ICP备14008679号