android - 如何防止应用进入待机状态?
问题描述
我需要一些帮助才能让我的应用程序在空闲模式下保持活跃,但没有成功。我的应用程序需要每 10 秒从服务器检索一些信息,我无法使用 FCM,因为服务器已经创建并且无法更改。由于 10 秒的间隔,我也无法使用 AlarmManager 或 JobScheduler。我还做了一个测试应用程序,它每秒振动,每秒增加一个值并显示当前值,但仍然没有成功。到目前为止,我尝试过:
- 将应用程序添加到电池优化设置中的“不允许”列表中,首先手动添加,然后请求适当的权限并显示请求的弹出窗口。这似乎没有效果,如果允许优化,应用程序的行为相同。
- 在主要活动中获得部分唤醒锁定,然后在两个地方的服务中。
- 使用后台线程。首先使用计时器,然后使用 while 循环。即使设备仍处于活动状态,应用程序似乎在被发送到后台 15 秒后进入睡眠状态。如果当时它在前台,它也会在按下电源按钮 15 秒后进入睡眠状态。
- 使用后台服务(首先绑定,然后不绑定)。首先使用计时器,然后使用带有 while 循环的单独线程。如果在设备处于活动状态或设备被发送到空闲状态(按下电源按钮)时将应用程序发送到后台,则应用程序将在 15 秒后停止运行。在这两种情况下,振动都会立即停止。
- 使上述服务成为前台服务。与后台服务的不同之处在于应用程序在后台运行 45 秒(设备处于空闲模式时仍为 15 秒),并且在应用程序运行时振动处于活动状态。在模拟器中,如果我拔掉电池并从 ADB 发送强制空闲命令,它工作正常,也在相同情况下的真实设备上。
解决方案
在不需要额外权限的情况下实现这一点的最简单方法是添加android:keepScreenOn="true"
到需要保持唤醒的视图中。像这样
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
...
</RelativeLayout>
您还可以FLAG_KEEP_SCREEN_ON
在活动中使用标志来保持屏幕开启。
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
有关更多信息,您可以在文档中了解有关保持设备唤醒的更多信息。
推荐阅读
- javascript - 枢轴计算器问题让它太有用了,变量有问题
- reactjs - 我可以从其他组件的默认道具中分配默认道具吗
- elasticsearch - ElasticSearch - 在 URLS 中搜索产品的分析器
- java - 如何通过非阻塞socketchannel发送字符串
- c# - C# 控制台应用程序,不能将类型“double”隐式转换为“string”?
- python - 如何使凯撒密码区分大小写?
- css - 定位文档中的第一个 h2 元素
- qgroundcontrol - 如何使 QGControl 连接到同一局域网中另一台主机的凉亭模拟实例?
- python-3.x - 在 Python 的 Pillow 中拼接两个 100 KB 的图像会产生 150 MB 的输出图像
- attributes - Magento 1.9 集合中的某些属性未显示在产品页面上?