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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 14:53:09