电话进入睡眠状态后,保持wifi在前台服务中处于活动状

我想在手机锁定时从wifi接收数据包。 问题是,当我锁定屏幕时,我的前台服务停止接收数据包。 我正在使用Foreground Service,如下所示:

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) { var notification = new Notification.Builder(this) .SetContentTitle(Resources.GetString(Resource.String.app_name)) .SetContentText(Resources.GetString(Resource.String.notification_text)) .SetSmallIcon(Resource.Drawable.ic_stat_name) .SetContentIntent(BuildIntentToShowMainActivity()) .SetOngoing(true) .AddAction(BuildRestartTimerAction()) .AddAction(BuildStopServiceAction()) .Build(); // Enlist this instance of the service as a foreground service StartForeground(Constants.SERVICE_RUNNING_NOTIFICATION_ID, notification); /*DO THIS EVEN WHEN SCREEN IS LOCKED*/ var powerManager = (PowerManager)GetSystemService(PowerService); _wakeLock = powerManager.NewWakeLock(WakeLockFlags.Partial, "WakeLockTag"); _wakeLock.Acquire(); var wifiManager = (WifiManager)GetSystemService(WifiService); _wifiLock = wifiManager.CreateWifiLock(WifiMode.FullHighPerf, "xamarin_wifi_lock"); _wifiLock.Acquire(); if (!powerManager.IsIgnoringBatteryOptimizations("com.xamarin.xample.foregroundservicedemo") || !_wakeLock.IsHeld || !_wifiLock.IsHeld) throw new InvalidOperationException("OPTIMIZATIONS NOT ACTIVE"); string msg = timestamper.GetFormattedTimestamp(); Log.Debug(TAG, msg); Intent intent = new Intent(Constants.NOTIFICATION_BROADCAST_ACTION); intent.SetAction(Android.Provider.Settings.ActionIgnoreBatteryOptimizationSettings); intent.PutExtra(Constants.BROADCAST_MESSAGE_KEY, msg); LocalBroadcastManager.GetInstance(this).SendBroadcast(intent); Task.Run(() => { using (var client = new UdpClient(12345)) { while (true) { var result = client.ReceiveAsync().Result; Console.WriteLine($"RECEIVED: {result.Buffer.Length}"); } } }); return StartCommandResult.Sticky; } 

我正在做以下事情以确保它没有被杀死

  1. 开始前台服务
  2. 使用StartCommandResult.Sticky
  3. 使用唤醒锁
  4. 使用Wifi锁
  5. 将WifiSleepPolicy设置为Never (我在手机设置中设置了它)
  6. 在intent中设置ActionIgnoreBatteryOptimizationSettings
  7. 在调试时通过adb命令提示将我的应用程序列入白名单

我还缺少什么? 我正在使用Samsung A5和Android 6.0 – API 23。

我查看了来自adb命令提示符的日志,并检查了我的服务实际上是作为Foreground Service运行并且所有锁都被保留。

你正在做的事情很棒,一切都很好。 然而!!

我们来看看devleport.android.com的post:

除非应用程序的核心function受到不利影响,否则Google Play政策会禁止应用程序直接豁免Android 6.0+(Doze和App Standby)中的电源管理function。

你说:

我正在使用Samsung A5和Android 6.0 – API 23。

这意味着,当手机进入睡眠状态时,您将无法保留前台服务,因为应用程序的核心function 不会 受到不利影响

这就是为什么你注意到你在手机睡着时停止接收数据包的原因。

请浏览我附上的完整链接以及电源管理器指南。

编辑: 我现在还注意到:

如果用户将设备拔出并静止一段时间,屏幕关闭,设备将进入打盹模式。 在打盹模式下,系统会通过限制应用程序访问网络和CPU密集型服务来尝试节省电池电量 它还可以防止应用程序访问网络并延迟其作业,同步和标准警报。

打盹限制

  • 网络访问被暂停。
  • 系统忽略唤醒锁定。
  • 标准AlarmManager警报(包括setExact()和setWindow())将延迟到下一个维护窗口。
  • 如果需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
  • 使用setAlarmClock()设置的警报继续正常启动 – 系统在警报触发前不久退出Doze。
  • 系统不执行Wi-Fi扫描。
  • 系统不允许同步适配器运行。
  • 系统不允许JobScheduler运行。

这将结束我对您所有查询的回答。

编辑2:

我进一步调查了一下,在Xamarin.Android中有关于这个问题的整篇文章 。

还有一个解决方案,每10分钟唤醒一次电话, 在这里绕过它。