【发布时间】:2019-12-25 23:24:17
【问题描述】:
一开始我构建了一个桌面应用程序(.NET Framework 中的 WPF)和引擎(.NET Framework 中的类库)。后来我尝试在 Xamarin.Forms/Xamarin.Android 中为 Engine 项目构建前端。当我刚刚添加对 Xamarin 项目的引用并且一切正常时,我感到很惊讶。
当我运行我的 android 应用程序并使用电源按钮阻止设备时出现问题 - 应用程序开始工作慢 2-3 倍。即使是 Task.Delay(1000) 也需要 1500-3000 毫秒才能执行。 我在引擎项目中有内部计时器,这个问题导致引擎内部的实时和时间之间的时间差异。
Engine 项目是多线程项目。它在工作期间创建和销毁许多线程。
我尝试过的:
- 使用 WakeLock.Partial。
- 使用 Android.App.Service
- 禁用电池电量优化
- 应用的所有权限
- 在设备设置中将应用程序添加到“白名单”(在后台工作,忽略电池 优化选项)
当设备连接到电源时,应用程序在被阻止的设备上正常工作。
安卓版本:10
是否可以让安卓设备的 CPU 一直保持全功率运行?设备被阻塞时如何保持代码执行速度正常?
【问题讨论】:
-
"...保持 android 设备的 CPU 一直以全功率运行..." :Linux 内核对此负责(并且 Android 不是实时操作系统),即如果设备处于“锁定”模式,那么如果设备包含具有“大”和“小”核心的 SoC,由于电源管理,您的应用程序的基于服务/广播意图的线程将被移动到小核心。但这在很大程度上取决于设备的 API 级别、设备中使用的 SoC 以及 OEM 如何调整 Android 的电源管理功能。
-
唯一可以“在某种程度上”保证您的应用程序继续运行的事情之一是使用前台服务(即使这在某种程度上取决于 OEM)。您看到诸如 Task.Delay 时间增加的原因是应用程序正在被操作系统暂停。在最新的 API 级别中,拥有全时运行服务变得越来越受限制,因此您的移动应用程序设计不应设计为需要全时服务(除非您是流媒体(即 VoIP)、音乐播放等...)。
-
@prog777,根据你的描述,你的意思是你在设备上调试xamarin.android,它工作正常,但是当设备阻塞时,这个项目工作很慢?
-
@SushiHangover 我用通知构建了前台服务。当我点击通知按钮时,我可以看到系统时间和我的引擎时间。在“锁定”模式下等待 1 分钟后,大约有 15 秒的差异。我认为可能是由于引擎在其他线程上进行计算,所以前台服务没有帮助(我不是android编程专家)。
-
@CherryBu-MSFT 是的,当设备连接到 PC USB 端口时,应用程序也可以正常工作 - 无论设备是否被阻止。当设备被阻止且未连接任何设备时,请不要工作。