You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android Java监听WiFi/移动数据网络连接状态的实现方案问询

当然可以实现!不过你说的NetworkManager应该是Android里的ConnectivityManager(大概率是笔误啦)——它就是专门用来监听网络连接状态变化的核心类,完全能满足你的需求,甚至比单纯的WiFi开关监听更强大。

实现方案:监听网络连接状态变化

1. 先声明必要权限

AndroidManifest.xml中添加权限,因为要访问网络状态信息:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- 可选,但如果要验证真实网络可用性建议加上 -->

2. 方式一:使用广播接收器(传统方案)

和你之前监听WiFi开关的逻辑类似,只不过要监听的是ConnectivityManager.CONNECTIVITY_ACTION广播。注意:Android 7.0(API 24)之后,这个广播不能静态注册,只能动态注册,所以我们在代码里动态注册/注销:

步骤1:创建广播接收器

private BroadcastReceiver networkStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 获取ConnectivityManager实例
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        // 获取当前活跃网络的信息
        NetworkInfo activeNetwork = connManager.getActiveNetworkInfo();
        
        // 判断网络是否可用(已连接且能正常通信)
        boolean isNetworkAvailable = activeNetwork != null && activeNetwork.isConnected();
        
        if (isNetworkAvailable) {
            // 还可以区分是WiFi还是移动数据
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                Log.v("NetworkStatus", "✅ WiFi已连接,网络可用");
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                Log.v("NetworkStatus", "✅ 移动数据已连接,网络可用");
            }
        } else {
            Log.v("NetworkStatus", "❌ 网络不可用");
        }
    }
};

步骤2:动态注册/注销接收器

建议在页面的生命周期方法里注册和注销,避免内存泄漏,比如在Activity中:

@Override
protected void onResume() {
    super.onResume();
    // 创建IntentFilter,指定要监听的广播动作
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(networkStateReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    // 页面暂停时注销接收器
    unregisterReceiver(networkStateReceiver);
}

3. 方式二:使用NetworkCallback(推荐高版本系统)

从Android 10(API 29)开始,getActiveNetworkInfo()被标记为过时,官方推荐使用ConnectivityManager.NetworkCallback来监听网络状态变化,这个方式功能更灵活,还能监听网络能力的变化:

步骤1:创建NetworkCallback实例

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    // 网络可用时触发
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
        Log.v("NetworkStatus", "✅ 网络已连接");
    }

    // 网络断开时触发
    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
        Log.v("NetworkStatus", "❌ 网络已断开");
    }

    // 网络能力变化时触发(比如从WiFi切换到移动数据)
    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities capabilities) {
        super.onCapabilitiesChanged(network, capabilities);
        // 检查是否具备互联网访问能力
        boolean hasInternet = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        // 判断网络类型
        boolean isWifi = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
        boolean isMobile = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
        
        if (hasInternet) {
            if (isWifi) {
                Log.v("NetworkStatus", "🔵 当前是WiFi网络,可访问互联网");
            } else if (isMobile) {
                Log.v("NetworkStatus", "🔴 当前是移动数据网络,可访问互联网");
            }
        } else {
            Log.v("NetworkStatus", "⚫ 当前网络无法访问互联网");
        }
    }
};

步骤2:注册NetworkCallback

// 在合适的时机(比如Activity的onCreate)注册
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// 构建网络请求,指定我们要监听的网络类型(这里监听具备互联网访问的网络)
NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .build();
// 注册回调
connManager.registerNetworkCallback(networkRequest, networkCallback);

步骤3:注销NetworkCallback

记得在页面销毁时注销,避免内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    connManager.unregisterNetworkCallback(networkCallback);
}

总结

  • 如果你需要兼容较低版本的Android系统,用广播接收器的方式更稳妥;
  • 如果目标系统是Android 10及以上,推荐使用NetworkCallback,它能提供更细致的网络状态信息,也更符合官方的发展趋势。

内容的提问来源于stack exchange,提问作者MantyQ2341414514

火山引擎 最新活动