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

