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

NET MAUI应用:屏幕休眠时后台服务停止问题求助

Android休眠后后台WiFi扫描服务停止问题求助

我已通过社区帮助解决了前期的Android后台WiFi扫描基础问题,当前需求是开发一个后台服务,实现扫描WiFi网络,发现特定SSID时执行对应操作的功能。

目前遇到的核心问题:

  • 应用关闭但设备处于正常使用状态时,服务运行正常
  • 设备进入休眠(屏幕关闭)后,服务停止运行;解锁设备后服务自动重启

相关代码

Android\Resource\DemoServices.cs

[Service(Name = "com.BackgroudAppTest.DemoServices")]
public class DemoServices : Service, IServicesTest
{   
    public int numeroUscite;
    public List<string> wifiResults = new List<string>();
    public string ssid;
    public override void OnCreate()
    {
        base.OnCreate(); 
    }
    public override IBinder OnBind(Intent intent)
    {
        throw new NotImplementedException();
    }
    [return: GeneratedEnum]
    public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
    {
        //service start
        if (intent.Action == "START_SERVICE")
        {
            System.Diagnostics.Debug.WriteLine("il servizio è iniziato");

            Task.Delay(2000);                
            //I receive the number from the user
            int intValue = intent.GetIntExtra("MyIntValue", -1) -1;
            string userString = intent.Extras.GetString("MySsid");
                // Run the WiFi scan
             Task.Run(async () =>
             {
                  while (true)
                  {
                     List<string> wifiResults = new List<string>();

                     var database = new Database();

                     wifiResults.Clear(); // Cleans up previous results

                      
                     var wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Context.WifiService);
                     var wifiList = wifiManager.ScanResults;

                        // Check if the specific SSID "myssid" exists in the list
                     bool mySsidExists = wifiList.Any(scanResult => scanResult.Ssid.Equals(userString));

                     if (mySsidExists)
                     {
                         intValue++;
                         MessItem nuovoGeoItem = new MessItem
                         {
                             Data = DateTime.Now,
                             Descrizione = "Entrato " + intValue
                         };
                         int esito = await database.AggiungiGeoItem(nuovoGeoItem);
                     }
                     else
                     {
                         numeroUscite++;
                         MessItem nuovoGeoItem = new MessItem
                         {
                             Data = DateTime.Now,
                             Descrizione = "Uscito " + numeroUscite
                         };
                         int esito = await database.AggiungiGeoItem(nuovoGeoItem);
                     }
                        //Please wait before running a new scan 
                        await Task.Delay(TimeSpan.FromMinutes(1));
                  }              
             });
            RegisterNotification();  
        }
        //stop servizio
        else if (intent.Action == "STOP_SERVICE")
        {
            System.Diagnostics.Debug.WriteLine("il servizio è fermato");
            StopForeground(true);
            StopSelfResult(startId);
        }
        return StartCommandResult.NotSticky;
    }
   
    public void Start()
    {
        Intent startService = new Intent(MainActivity.ActivityCurrent, typeof(DemoServices));
        startService.SetAction("START_SERVICE");
        MainActivity.ActivityCurrent.StartService(startService);
    }
    public void Stop()
    {          
        Intent stopIntent = new Intent(MainActivity.ActivityCurrent, this.Class);
        stopIntent.SetAction("STOP_SERVICE");
        MainActivity.ActivityCurrent.StartService(stopIntent);
    }
    public override void OnDestroy()
    {
        base.OnDestroy();
    }
    private void RegisterNotification()
    {
        NotificationChannel channel = new NotificationChannel("ServicioChannel", "Servizio Scan", NotificationImportance.Max);
        NotificationManager manager = (NotificationManager)MainActivity.ActivityCurrent.GetSystemService(Context.NotificationService);
        manager.CreateNotificationChannel(channel);
        Notification notification = new Notification.Builder(this, "ServicioChannel")
            .SetContentTitle("Servizo Attivo")
            .SetSmallIcon(Resource.Drawable.abc_switch_thumb_material)
            .SetOngoing(true)
            .Build();

        StartForeground(100, notification);
    }
}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true">
        <service
            android:name=".Services.DemoServices"
            android:exported="false"
            android:stopWithTask="false" />
    </application>
    
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.NETWORK_SETUP_WIZARD" />
    <uses-permission android:name="android.permission.NETWORK_SETTINGS" />
    <uses-permission android:name="android.permission.PROCESS_STATE_BACKGROUND" />
    <uses-permission android:name="android.permission.PROCESS_STATE_CACHED" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    
</manifest>

恳请各位帮忙解决该问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:17:08