You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Xamarin.Android中网络切换检测BroadcastReceiver实现失败

解决Xamarin.Android中网络切换BroadcastReceiver不工作的问题

嘿,作为同样用Xamarin搞Android开发的过来人,太懂你这种看着Java方案无从下手的感觉了!结合你的C#基础,我给你整理一套完整的Xamarin版本实现步骤,帮你搞定网络切换监听:

一、创建自定义BroadcastReceiver类

首先我们要写一个继承自BroadcastReceiver的C#类,这是Xamarin里实现广播接收的核心:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { ConnectivityManager.ConnectivityAction })]
public class NetworkChangeReceiver : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {
        // 网络切换时触发的逻辑
        if (intent.Action == ConnectivityManager.ConnectivityAction)
        {
            // 调用你已实现的获取当前网络方法,或直接在这里判断网络类型
            var connectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
            var activeNetwork = connectivityManager.ActiveNetworkInfo;
            
            if (activeNetwork != null && activeNetwork.IsConnected)
            {
                string networkType = "";
                switch (activeNetwork.Type)
                {
                    case ConnectivityType.Wifi:
                        networkType = "Wifi";
                        break;
                    case ConnectivityType.Mobile:
                        // 进一步判断4G/5G等移动网络类型
                        var mobileInfo = (TelephonyManager)context.GetSystemService(Context.TelephonyService);
                        networkType = mobileInfo.NetworkType switch
                        {
                            NetworkType.Lte => "4G",
                            NetworkType.Nr => "5G",
                            _ => "移动网络(其他)"
                        };
                        break;
                    default:
                        networkType = "未知网络";
                        break;
                }
                
                // 这里可以把当前网络类型传递给你的统计模块
                Console.WriteLine($"当前切换到{networkType}网络");
            }
            else
            {
                Console.WriteLine("网络已断开");
            }
        }
    }
}

二、动态注册广播接收器(关键!高版本必须这么做)

从Android 7.0(API 24)开始,系统限制了静态注册的广播接收器接收CONNECTIVITY_ACTION这类隐式广播,所以我们需要在Activity或者Service里动态注册,才能保证正常触发:

在Activity中注册/注销

private NetworkChangeReceiver _networkReceiver;

protected override void OnResume()
{
    base.OnResume();
    // 注册广播接收器
    _networkReceiver = new NetworkChangeReceiver();
    var intentFilter = new IntentFilter(ConnectivityManager.ConnectivityAction);
    RegisterReceiver(_networkReceiver, intentFilter);
}

protected override void OnPause()
{
    base.OnPause();
    // 一定要注销,避免内存泄漏
    if (_networkReceiver != null)
    {
        UnregisterReceiver(_networkReceiver);
        _networkReceiver = null;
    }
}

三、添加必要的权限

别忘了在AndroidManifest.xml里添加网络状态权限,否则无法获取网络信息:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 如果需要更详细的移动网络类型,还需要这个权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

四、额外注意事项

  • 如果你的应用要适配Android 10及以上版本,获取详细移动网络类型(比如4G/5G)时,READ_PHONE_STATE权限需要动态申请,不能只在Manifest里声明。
  • 后续做流量统计的话,可以用TrafficStats类来获取各网络的流量数据,这个类Xamarin有对应的封装,用法和Java类似,只是语法换成C#就行。

按照这个步骤来,你的网络切换监听应该就能正常工作了,之后就可以在这个基础上扩展流量统计的逻辑啦!

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:20:09