求助: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
相关产品推荐
相关产品推荐

