.NET Maui Android应用:后台监听网络变化并自动重试传输咨询
针对.NET Maui Android应用的后台网络监听与重启后重试方案
你的需求核心是后台监听网络切换、设备重启后自动恢复监听,并在网络可用时触发文件传输重试,以下是基于Android平台特性的具体实现步骤:
一、配置必要的Android权限
首先在Platforms/Android/AndroidManifest.xml中添加权限,确保应用能访问网络状态、接收开机广播:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 可选,用于提高后台进程优先级 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Android 12+ 前台服务需要 -->
二、实现网络状态监听(Android平台特定)
使用Android官方推荐的ConnectivityManager.NetworkCallback替代旧的广播接收器,它能更可靠地在后台监听网络变化:
using Android.Content; using Android.Net; using Android.OS; namespace YourAppNamespace.Platforms.Android { public class NetworkStatusCallback : ConnectivityManager.NetworkCallback { private readonly Context _appContext; public NetworkStatusCallback(Context context) { _appContext = context.ApplicationContext; } // 网络恢复可用时触发 public override void OnAvailable(Network network) { base.OnAvailable(network); // 启动文件传输重试任务 FileTransferWorker.ScheduleTransferTask(_appContext); } // 网络断开时可做状态记录 public override void OnLost(Network network) { base.OnLost(network); // 可选:标记当前网络不可用,暂停正在进行的传输 } } }
三、用WorkManager执行后台文件传输
WorkManager是Android官方的后台任务调度工具,能保证任务在应用被杀或设备重启后依然执行:
using Android.Content; using androidx.work; using System.Net.Http; using System.Threading.Tasks; namespace YourAppNamespace.Platforms.Android { public class FileTransferWorker : Worker { public FileTransferWorker(Context context, WorkerParameters params) : base(context, params) { } public override Result DoWork() { // 1. 测试服务器连接 bool canReachServer = TestServerConnectivity(); if (!canReachServer) { // 连接失败,按退避策略重试 return Result.InvokeRetry(); } // 2. 执行文件传输逻辑 ExecuteFileTransfer(); return Result.InvokeSuccess(); } // 调度传输任务 public static void ScheduleTransferTask(Context context) { var request = OneTimeWorkRequest.Builder.From<FileTransferWorker>() .SetBackoffCriteria(BackoffPolicy.Exponential, TimeSpan.FromSeconds(10), TimeUnit.Seconds) .Build(); WorkManager.GetInstance(context).Enqueue(request); } // 实现服务器连通性测试 private bool TestServerConnectivity() { try { using var client = new HttpClient(); // 替换为你的服务器测试接口或IP var response = client.GetAsync("http://your-server-address/test").Result; return response.IsSuccessStatusCode; } catch { return false; } } // 实现文件传输逻辑 private void ExecuteFileTransfer() { // 这里编写你的文件上传代码 } } }
四、实现开机自启,重启后恢复监听
创建广播接收器,在设备重启完成后自动初始化网络监听:
using Android.Content; using Android.Net; namespace YourAppNamespace.Platforms.Android { [BroadcastReceiver(Enabled = true, Exported = true)] [IntentFilter(new[] { Intent.ActionBootCompleted })] public class BootCompletedReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { if (intent.Action != Intent.ActionBootCompleted) return; // 初始化网络监听 RegisterNetworkCallback(context.ApplicationContext); } private void RegisterNetworkCallback(Context context) { var connectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService); var networkRequest = new NetworkRequest.Builder() .AddCapability(NetCapability.Internet) .AddTransportType(TransportType.Wifi) .AddTransportType(TransportType.Cellular) .Build(); connectivityManager.RegisterNetworkCallback(networkRequest, new NetworkStatusCallback(context)); } } }
五、应用启动时初始化监听
在MainActivity中注册网络监听,确保应用启动后立即开始监听:
using Android.App; using Android.Content; using Android.Net; using Android.OS; namespace YourAppNamespace.Platforms.Android { [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] public class MainActivity : MauiAppCompatActivity { private NetworkStatusCallback _networkCallback; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); InitializeNetworkListener(); } private void InitializeNetworkListener() { var connectivityManager = (ConnectivityManager)GetSystemService(Context.ConnectivityService); var networkRequest = new NetworkRequest.Builder() .AddCapability(NetCapability.Internet) .AddTransportType(TransportType.Wifi) .AddTransportType(TransportType.Cellular) .Build(); _networkCallback = new NetworkStatusCallback(this); connectivityManager.RegisterNetworkCallback(networkRequest, _networkCallback); } protected override void OnDestroy() { base.OnDestroy(); // 注销监听,避免内存泄漏 var connectivityManager = (ConnectivityManager)GetSystemService(Context.ConnectivityService); connectivityManager.UnregisterNetworkCallback(_networkCallback); } } }
关键注意事项
- 动态权限申请:Android 12+需要动态申请
POST_NOTIFICATIONS权限,如果使用前台服务保持进程存活,必须先申请该权限。 - 退避策略:WorkManager的退避策略建议用指数退避,避免频繁重试消耗设备资源。
- 局域网适配:测试服务器连接时,可根据当前网络类型(WiFi/蜂窝)调整检测逻辑,确保只在能访问目标服务器的网络下触发传输。
内容的提问来源于stack exchange,提问作者eko
相关产品推荐
相关产品推荐

