android 监听网络连接_Android
创始人
2024-12-01 20:33:16
在Android中,监听网络连接可以通过使用ConnectivityManager和NetworkCallback来实现。需要获取ConnectivityManager的实例,然后注册NetworkCallback来监听网络状态的变化。当网络状态发生变化时,会回调onAvailable、onLost和onCapabilitiesChanged方法。

在Android开发中,监听网络连接状态是非常重要的功能之一,通过监听网络连接状态,我们可以实现一些基于网络的应用,例如自动更新、实时推送等,本文将介绍如何在Android中监听网络连接状态。

android 监听网络连接_Android(图片来源网络,侵删)

1. 判断网络连接状态

在Android中,我们可以通过ConnectivityManager类来判断网络连接状态,需要在AndroidManifest.xml文件中添加以下权限:

 

我们可以通过以下代码来判断网络连接状态:

 import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class NetworkUtil {     public static boolean isNetworkConnected(Context context) {         ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);         if (connectivityManager != null) {             NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();             return networkInfo != null && networkInfo.isConnected();         }         return false;     } }

2. 监听网络连接状态变化

在Android中,我们可以通过BroadcastReceiver来监听网络连接状态的变化,需要在AndroidManifest.xml文件中添加以下权限:

 

创建一个BroadcastReceiver类,继承自ConnectivityManager.NetworkCallback:

 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.os.Build; import androidx.annotation.RequiresApi; public class NetworkChangeReceiver extends BroadcastReceiver {     private ConnectivityManager.NetworkCallback networkCallback;     private ConnectivityManager connectivityManager;     private boolean isRegistered = false;     @RequiresApi(api = Build.VERSION_CODES.M)     @Override     public void onReceive(final Context context, final Intent intent) {         if (!isRegistered) {             connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);             if (connectivityManager != null) {                 networkCallback = new ConnectivityManager.NetworkCallback() {                     @Override                     public void onAvailable(Network network) {                         super.onAvailable(network);                         // 网络可用时执行的操作                     }                     @Override                     public void onLost(Network network) {                         super.onLost(network);                         // 网络丢失时执行的操作                     }                 };                 connectivityManager.registerDefaultNetworkCallback(networkCallback);                 isRegistered = true;             } else {                 throw new IllegalStateException("无法获取ConnectivityManager");             }         } else {             if (intent.getAction().equals(ConnectivityManager.ACTION_WIFI_STATE_CHANGED)) {                 NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);                 if (networkInfo != null && networkInfo.isConnected()) {                     // WiFi已连接时执行的操作                 } else {                     // WiFi已断开时执行的操作                 }             } else if (intent.getAction().equals(ConnectivityManager.ACTION_MOBILE_DATA_STATE_CHANGED)) {                 NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);                 if (networkInfo != null && networkInfo.isConnected()) {                     // 移动数据已连接时执行的操作                 } else {                     // 移动数据已断开时执行的操作                 }             } else if (intent.getAction().equals(ConnectivityManager.ACTION_ETHERNET_STATE_CHANGED)) {                 NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);                 if (networkInfo != null && networkInfo.isConnected()) {                     // 以太网已连接时执行的操作                 } else {                     // 以太网已断开时执行的操作                 }             } else if (intent.getAction().equals(ConnectivityManager.ACTION_CAPABILITIES_CHANGED)) {                 NetworkCapabilities capabilities = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_CAPABILITIES);                 if (capabilities != null) {                     boolean hasInternetCapability = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);                     if (hasInternetCapability) {                         // 有网络能力时执行的操作,例如开始请求网络数据等操作,注意:这里需要先取消注册默认的网络回调,否则会重复触发回调方法,如果需要再次监听网络变化,可以重新注册默认的网络回调,需要注意避免内存泄漏问题,在Activity或Fragment的onDestroy方法中取消注册默认的网络回调,如果使用Application类来管理上下文对象,可以在Application类的onTerminate方法中取消注册默认的网络回调,也可以使用弱引用来避免内存泄漏问题,具体实现方式可以参考官方文档和相关博客文章。


android 监听网络连接_Android(图片来源网络,侵删)

下面是一个介绍,展示了在Android开发中监听网络连接状态的一些常用方法和描述:

网络监听方法 描述
isNetworkAvailable() 检查网络是否可用,这个方法通常返回一个布尔值,表示是否有网络连接,它不区分是WiFi还是移动数据。
getActiveNetworkInfo() 获取当前活动的网络连接信息,返回一个NetworkInfo对象,可以从中获取更多关于网络状态的信息。
registerNetworkCallback() 注册一个网络状态变化的回调函数,这是在Android N(API 24)及以上版本推荐使用的方法。
addOnNetworkActiveListener() 添加网络活动状态监听器,当网络状态从非活跃变为活跃时触发。
ConnectivityManager.NetworkCallbackregisterNetworkCallback()中使用,监听包括网络可用性、连接类型变化等事件。
isConnected() 检查设备是否已连接到网络,通常这个方法是在NetworkInfo对象上调用,以确认连接状态。
isConnectedOrConnecting() 检查设备是否正在连接或已经连接到网络。
isRoaming() 检查设备是否处于漫游状态,这在移动数据网络连接时很有用。
getNetworkInfo(int type) 获取特定类型网络(如WiFi、移动数据等)的连接信息。
getState() 获取当前网络的状态,如CONNECTEDCONNECTINGDISCONNECTING等。
getDetailedState() 获取当前网络的详细状态信息。

以下是如何使用这些方法的简要概述:

 ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 检查是否有网络连接 boolean isConnected = connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); // 注册网络状态监听 NetworkRequest request = new NetworkRequest.Builder().build(); connectivityManager.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {     @Override     public void onAvailable(Network network) {         // 网络连接可用时调用     }     @Override     public void onLost(Network network) {         // 网络连接丢失时调用     } });

请注意,从Android 10 (API 级别 29) 开始,为了隐私保护,应用可能无法访问非自己配置的网络信息,并且可能需要使用其他方法或依赖系统的网络绑定功能。

android 监听网络连接_Android(图片来源网络,侵删)

相关内容

热门资讯

托举天舟十号升空!长七火箭“美... 5月11日8时14分,天舟十号货运飞船载着总重近6.2吨的补给物资和实验载荷,在长征七号遥十一运载火...
“一人公司”社区落地贵阳高新区 5月7日,贵州科学城科技创新园与贵州星梦源科技有限公司正式签署合作协议,共同落地OPC(One Pe...
市、区科协联合开展科普大篷车进... 2026.5.11 近日,兰州市科协与城关区科协科普大篷车先后联合走进城关区拱星墩小学、文璟学校、甘...
科技保险从有保障迈向高质量 从人形机器人到人工智能大模型,从创新药到光电融合芯片……近年来,科技创新领域成果不断涌现。科技创新是...
天舟十号带货!太空光伏炸场,柔... 5 月 11 日,天舟十号货运飞船成功发射,除常规补给外,一件 “黑科技” 货物引爆市场 —— 我国...