当前位置:首页 > 行业动态 > 正文

安卓实时监听网络状态

实现原理

安卓系统通过广播机制通知应用网络状态的变化,当网络连接/断开或网络类型改变时,系统会发送CONNECTIVITY_CHANGE广播,应用可通过BroadcastReceiver监听该广播,并结合ConnectivityManager获取当前网络状态。


实现步骤

添加权限

AndroidManifest.xml中声明访问网络状态的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

创建网络状态监听器

定义BroadcastReceiver子类,重写onReceive方法处理网络变化逻辑:

安卓实时监听网络状态  第1张

public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取当前网络状态
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();
        boolean isConnected = networkInfo != null && networkInfo.isConnected();
        String type = networkInfo != null ? networkInfo.getTypeName() : "None";
        // 根据需求处理网络变化
        Log.d("NetworkStatus", "Connected: " + isConnected + ", Type: " + type);
    }
}

注册监听器

方式1:动态注册(推荐)
在需要监听的组件(如Activity)中注册和注销:

// 注册
NetworkChangeReceiver receiver = new NetworkChangeReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(receiver, filter);
// 注销(如在Activity的onDestroy中)
unregisterReceiver(receiver);

方式2:静态注册(全局监听)
AndroidManifest.xml中声明接收器:

<receiver android:name=".NetworkChangeReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

网络状态判断方法

方法 说明 适用场景
networkInfo.isConnected() 判断是否有网络连接 基础连接检测
networkInfo.getType() 获取网络类型(如TYPE_WIFI 区分Wi-Fi/移动数据
networkInfo.isAvailable() 判断网络是否可用(非漫游/封锁状态) 高级可用性检测

注意事项

  1. API兼容性

    • getActiveNetworkInfo()在API 23+被弃用,建议使用NetworkCapabilities替代:
      NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
      boolean isWifi = capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
  2. 性能优化

    • 网络状态变化可能频繁触发广播,建议在onReceive中做防抖处理(如延迟执行或状态标记)。
  3. 后台监听限制

    • Android 8.0+对后台注册接收器有限制,需在前台服务中注册或使用JobScheduler

扩展功能:获取网络详情

需求 方法 示例
获取IP地址 WifiManagerNetworkInterface WifiManager.getConnectionInfo().getIpAddress()
判断是否为漫游网络 networkInfo.isRoaming() 移动数据场景下有效
检测代理设置 System.getProperty("http.proxyHost") 需处理异常

相关问题与解答

问题1:如何判断当前网络是否可用?
解答:通过ConnectivityManager获取NetworkInfo对象,检查isConnected()isAvailable()是否为true

boolean isNetworkAvailable = networkInfo != null && networkInfo.isConnected() && networkInfo.isAvailable();

问题2:如何监听指定类型的网络变化(如仅Wi-Fi)?
解答:在onReceive中过滤网络类型:

if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
    // 处理Wi-Fi变化逻辑
}
0