问题标签 [doze]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 打盹模式与网络状态
我正在开发一个应用程序来检查 Wi-Fi 状态。如果没有 Wi-Fi 连接,应用程序必须显示断开连接符号。从 Marshmallow 开始,如果设备进入“打盹模式”,我的设备网络将进入暂停模式。
如果我通过按电源按钮唤醒我的设备,Wi-Fi 会自动变为Active状态吗?
android - 唤醒设备,一旦进入打盹模式
我正在开发应用程序来检查哪些必须连接到 MQTT 服务器才能从服务器获取消息。当 android 设备进入打盹模式时,客户端(Android)会自动断开连接,因为网络已暂停但处于活动状态。
一旦设备进入打盹模式,我需要唤醒我的设备,连接到使用 MQTT 的服务器
我已经为此编写了代码,我需要确保我是否在正确的轨道上?
android - 在空闲模式下获取位置更新
在打盹模式下,我必须找到一种解决方案来获取位置更新。更新是连续的还是每 5 分钟或更长时间都没有关系。目前我有一个前台服务,它获取一个带有 LocationListener 的唤醒锁。该应用程序也被列入白名单。我的服务在打瞌睡时不会被杀死,但 gps 信号会。我找不到获取位置更新的解决方案。我还尝试使用 AlarmManager.setExactAndAllowWhileIdle 启动服务,服务以打瞌睡状态启动,但仍然没有位置更新。
使用按钮启动服务的MainActivity:
前台服务:
android - 什么是 Android 进程“灰烬”以及如何防止它使我的应用程序休眠?(Android 7.0 打盹模式)
我编写了一个应用程序,只要它使用清单中声明并触发的广播接收器运行,它就需要每分钟唤醒一次,AlarmManager.setAlarmClock()
因为它是唯一一个似乎可以在 Android 7+ 上运行且不受警报重复限制的确切解决方案。
我觉得我已经按照网络上的每一个提示(尤其是 SO)来保持我的应用程序运行,但迟早它会进入打瞌睡或休眠状态,即使我将我的应用程序列入白名单Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
并且我正在使用安排下一个闹钟时,接收器内部的唤醒锁定。
负责“冻结”我的应用程序的进程是“ ash ”。我在哪里可以找到有关此过程的更多信息?它特定于制造商的操作系统吗?
如何禁用我的应用程序的打瞌睡/休眠?我一辈子都无法让这个该死的应用程序继续运行。任何提示表示赞赏!
使用的设备是带有Android 7.0的Huawei P8 lite 2017。由于源代码已经变得相当复杂,而且我认为我在代码方面所做的一切都是正确的,所以我现在不在这里发布任何代码。(不过,我会根据要求提供相应的代码示例。)
手头的问题似乎是操作系统本身的普遍问题,因为我读到很多人没有让它工作。(这太荒谬了……用设置精确计时器的能力来稍微提高电池寿命。为什么,谷歌?)
以下 catlog 输出显示了“ash”的动作;在这种情况下,它在正常工作大约半小时后冻结了我的应用程序大约半小时。我想当我再次打开并解锁手机时,该应用程序又继续工作了。
android - 受打盹模式影响的 ForgroundService
我的警报应用程序一直迟到,虽然我是从及时调用的 gehts 开始的ForegroundService
,BroadcastReceiver
但是延迟onCreate()
调用(有时),我认为这是来自电话在它可以执行之前再次陷入瞌睡它...Service
onStartCommand()
正如您从 Log.d 中看到的那样,服务及时启动并及时调用 PlayerActivity - 但在这种情况下,这个服务实际上是在 1:40 分钟后开始的。另外,在随机延迟时间过去之前,服务不会进入前台,也不会开始播放音乐(维护窗口?)
我们应该如何让设备保持足够长的唤醒时间以实际启动前台服务并及时进入前台?
我setExactAndAllowWhileIdle()
用来调用 AlarmReceiver -这适用于 100% 的情况。延迟发生在启动服务之后。
我是否应该提前 15 分钟启动服务,以确保它在实际闹钟时间前进入前台并实际开始播放音乐并在实际闹钟时间调用 Activity?
广播接收器
服务
根据Log.d:
闹钟在 95% 的使用时间里都能正常工作,但有时这种打瞌睡会出现并在 1-15 分钟后启动闹钟 - 我已经调试了两个多星期了,重写了整个服务和接收器类 2 次开始变得疯狂,请帮助。
编辑
我最终使用了一个唤醒广播接收器和一个唤醒服务(对于所有 API < 26),然后相应地调用其他服务(我之前在 AlarmReceiver 中所做的 - 并且仍然为 API >= 26 做)
到目前为止,它似乎工作得很好——只有在我的一台运行 Lineage 的测试设备上,有时警报会迟到,在我自己的日常使用电话上,我也在运行 Lineage,但它做得很好。也许 SGS 4 mini 太旧了(我真的不相信这一点,但只要没有人抱怨,我就不得不假设它按预期工作)
感谢您的帮助@Elletlar。
java - DOZE-Standby 干扰蓝牙重新连接逻辑
我在 Android 设备上编写应用程序时发现了一个问题。我正在尝试从 BLE 传感器(Nordic Thingy)不断收集数据。一切运行顺利,但如果我达到设备断开连接一段时间(例如信号不良)的程度,设备可以进入打盹模式。
正在订阅 BLE 特性并且正在接收更新时,打盹模式不会受到影响。有没有办法以编程方式克服打盹待机模式,以便我的设备即使断开连接也能继续搜索设备?
这是我项目的一项关键任务,我还没有找到任何方法来处理这种行为。
android - 打盹模式期间没有互联网连接
在我的应用程序中,我需要每 15 分钟从网站下载一次数据。我的问题是,当手机处于打盹模式时,由于节能,连接不存在。我尝试使用由 Alam 管理器每 15 分钟激活一次的 WakefulBroadcastReceiver,但由于手机仍处于打盹模式,连接几乎总是不存在。我已经阅读了jobscheduler,但如果它对我的问题有用并且可能如何实现它,则没有。有没有人有一个代码示例,允许我通过每15分钟从打盹模式唤醒手机从站点下载数据?
gps - 在 Android 8 中使用 GPS 和 DOZE
我有一个运行后台服务的应用程序来监控 GPS 位置并将其与位置列表进行比较。当它找到匹配时,它会发送一个广播来触发一个前台活动,然后显示有关该位置的信息。GPS 跟踪使用 Google Play 服务中的 GPS 功能,并且需要大约每 20 秒更新一次。
大多数时候,用户不知道应用程序,可以做其他事情。前台 UI 可能不会比每 2 分钟更频繁地触发,它可能长达 20 分钟或更长时间。其余时间,重要的是应用程序可以继续获取 GPS 位置,而不会中断用户正在做的任何其他事情。
我正在尝试了解 Android 8 中新的 Doze 和 Standby 功能的影响。从阅读最新的文档来看,我认为它将不再工作,并且后台服务将无法获得更新(或只会获得一些更新)每小时,这是没用的)。谁能告诉我这是否正确?
他们似乎说我应该使用前台服务,但在其他地方他们说前台服务应该只用于需要一些用户交互的地方。看起来像第 22 条。对于这样的事情,前台服务可以吗?
文档还提到了白名单,但我不清楚这到底是做什么的。我可以将我的应用列入白名单以使其继续运行吗?
任何人都可以帮助一个困惑的业余开发者吗?
克里斯小号
android - 如何使定期后台工作(15 分钟的定期间隔)在奥利奥及以后无限期地运行?
在 Android 8 中引入打盹模式后,Android 对后台工作实施了许多限制,这使得应用程序以意想不到的方式运行。
在我的一个应用程序中,我过去每 15 分钟获取一次电池电量,并在电池电量高于用户在我的应用程序中设置的所需电池电量时发出警报。我使用以下代码来完成此任务。
使用 AlarmManagerApi 设置重复警报:
其中 getAlarmPendingIntent 方法如下:
设置一个 BroadcastReciever 来接收警报:它在前台启动一个服务来完成所需的后台工作
TaskService(Service做一些期望的任务)如下
BatteryCheckAsync 任务从后台获取电池电量并在日志中显示当前电池电量。
现在,如果我运行该应用程序并将该应用程序从我最近的应用程序列表中滑出并关闭设备的屏幕。
该应用程序在 Android 8 之前的 android 版本中打印带有电池电量的日志。但是在 android 8 之后,在将应用程序从我最近的应用程序列表中滑出并关闭设备屏幕后的几分钟内,它就停止了工作。上述行为是预期的,因为在 android 中引入了打盹模式,并且警报被推迟到下一个维护窗口。
==================================================== ================
从https://developer.android.com/training/monitoring-device-state/doze-standby上的 android 文档中,我发现它记录了
标准 AlarmManager 警报(包括 setExact() 和 setWindow())被推迟到下一个维护窗口。
如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
使用 setAlarmClock() 设置的警报继续正常触发——系统在这些警报触发前不久退出打盹。
所以,我现在修改我的代码如下:
在通过再次运行上述setAlarm()方法在广播接收器的 onRecieve 方法中处理每个警报传递时,我没有设置重复警报,而是设置了一次精确警报并自己安排下一个警报。
现在,如果我运行该应用程序并将该应用程序从 OnePlus 3 上的“最近应用程序列表”中滑出并关闭设备屏幕,该应用程序会打印大约 40-45 分钟的日志,然后突然警报和前台服务停止运行。
有没有人在Android Oreo及更高版本中保证无限期执行周期性后台任务的解决方案?我正在安装了 Android Oreo 或更高版本的 OnePlus 设备上对其进行测试。
android - ForegroundService 中的 WebSocket 停止
我目前正在构建一个通过 WebSocket (通过来自 TooTallNate 的 Java WebSockets)连接到服务器的 Android 应用程序。问题是在我的 Moto Z Play(Android 8.0)和我的 Acer Iconia A3-A40(Android 6.0)上,WebSocket 得到在随机时间(8 到 25 分钟之间)后关闭。在我的 HTC ONE(Android 5.0)上,我添加了唤醒锁和 wifilock(让它运行 3 小时,完美运行)后,这并没有发生。Android Studio Emulator 上不会出现此问题。在我的 Moto Z Play 上,在我的 WebSocket 关闭之前,我得到了以下日志:
我做了一些研究,并认为暂停网络访问会是一个打瞌睡的问题,但有一些事情反对这一点:
- websocket 在 ForegroundService 中启动(不包括打瞌睡?)
- 设备已插入(插入时打盹不会启动)并且 websocket 仍然停止
- 即使更改电池优化,它仍然发生(一段时间后但仍然发生)
(但我可能是错的)
到目前为止我做了什么:
通过以下方式启动 ForegroundService:
获取 wakeLock 和 wifilock(并在 websocket 关闭时释放):
检查了 onStartCommand-Method
提前致谢