问题标签 [android-doze-and-standby]

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.

0 投票
1 回答
439 浏览

android - 手机空闲时,Android 传感器不会收集数据

我正在尝试开发一个适用于 Android 的应用程序,在该应用程序中,我从多个传感器(如果设备上可用)获取数据并将其写入文件,稍后将对其进行分析以用于某些用途。我面临着几个问题,一个我可以忽略的小问题和一个我无法解决并导致应用程序无法正常运行的主要问题。

- 小问题

我正在从以下位置收集数据:加速度计、线性加速度计、陀螺仪和磁力计以及 GPS,但它们的工作方式完全不同,并且只能以低得多的频率进行采样,所以我暂时忽略它。我通过为每个传感器实现一个监听器来收集数据:

我使用以下方法将频率设置为~50Hz:

收集数据时,我知道频率不可能 100% 稳定,但奇怪的是它在每个传感器(大约 50Hz)上都或多或少地保持稳定,除了加速度计,大部分时间它以 100Hz 采样并且有时会下降到 50Hz。

有什么我可能做错了或有什么方法可以控制吗?到目前为止,我尝试过的每台设备都发生了这种情况,尽管它们的行为方式并不完全相同。

- 主要问题

我将信息写入文件,首先将我从传感器获取的所有内容写入字符串,然后每隔 X 秒,将字符串上的内容写入文件并清除它,以便传感器侦听器可以继续写入但它不会变得无限长。

我这样写在字符串上:

然后使用以下命令将其保存到文件中:

在监听器中,每次我停止监听时,我都会将“initTime”设置为 -1,因此样本总是从 0 开始,一直到监听周期的持续时间(以毫秒为单位)。(忽略 DELIMITER 只是格式问题)。

我的主要应用程序破坏问题如下:

在大多数手机中(一些幸运的手机可以完美运行)1 或 2 件事情都失败了。

在某些情况下,在闲置一段时间后(例如锁定并放在口袋里),传感器会停止记录数据,因此应用程序只会写入空白值,直到我再次唤醒手机。

在其他情况下,更糟糕的是,不仅传感器停止记录数据,而且计时器/写入文件似乎也停止工作,当手机再次唤醒时,它会尝试写入它应该写入的内容没有工作并且弄乱了所有的时间戳,在“过去”的不同点写入相同的样本,直到它赶上当前时间。(如果您将其可视化为图表,它基本上看起来好像数据收集回到了过去)。

有什么方法可以确保应用程序在任何情况下都能继续工作,无论手机是否被锁定、打瞌睡、应用程序是否最小化、在后台、前台等?

我尝试了一种我在谷歌上搜索的方法,该方法包括设置和警报以每隔 X 秒“唤醒进程”(无论我设置什么时间,它每分钟最多只能工作一次)。我看到每次警报响起的几毫秒内,它再次捕获样本但随后立即进入睡眠状态,它并没有让手机在更长的时间内保持“清醒”。它没有解决任何问题,即使在短时间内强制传感器收集数据,它也只能帮助唤醒传感器,定时器/写入文件的问题仍然存在。

希望有人能阐明如何让手机无论如何收集数据,我一直在尝试我能想到的一切,但我一无所获。对不起,文字砖,但我真的不知道如何用更短的方式解释它。

PS:我发现打开省电模式会让情况变得更糟,即使在通常可以正常工作的手机上,它也开始把事情搞砸了。所以另一个问题是......我怎样才能阻止它干扰?

0 投票
1 回答
1328 浏览

android - 手机空闲/打瞌睡/锁定时Android服务不工作

晚上好,

几天来我一直在努力实现一些目标,我真的不知道还能尝试什么,我基本上已经尝试了我在网上找到的所有东西,但它仍然不起作用,但我有一种感觉,一旦我找到了解决方案它必须非常简单。

我正在做一个更大的项目,但在这里我只是想得到一个非常简单的例子来工作,我以后可以适应我的项目。

我想做的事

我想让一个计数器在 1200 秒(20 分钟)内每秒添加 +1,并在每次计数时写入文件。我最终应该得到一个包含 1200 行的文件,每个样本都有一个时间戳。

我是如何做到的

我已经尝试了一百万件事,但在这里,我只是回到了一个非常基本的例子,所以我可以展示它并寻求帮助:

  • 我有一个带有单个开始按钮的主要活动。
  • 单击按钮时,我从活动开始一个新进程。这是一个 FOREGROUND 过程。
  • 我开始循环计数。当我达到 1200 时,计数停止。

我的问题

虽然手机屏幕处于打开状态,但一切正常,但一旦我锁定屏幕并将手机放入口袋,取决于我正在测试的手机,它开始出现故障。

我想要什么

如果有人能告诉我要修改/添加/更改什么,甚至为我做,然后在这里写回(这是一个非常简单的项目),我将非常感激,我浪费了大量时间,我只是无法按右键。

代码

由于这是一个非常简单的项目,我将在这里复制它包含的 4 个部分:

XML activity_main.xml

清单AndroidManifest.xml

主要MainActivity.java

前台服务ForegroundService.java

我知道我的要求可能有点过分,但此时我非常绝望。如果有人能提出一个可行的解决方案,我会非常感激。

非常感谢。

0 投票
1 回答
534 浏览

android - 当应用程序位于电池优化白名单时,如何在打盹模式下使用 wifi?

我目前正在开发一个 Android 应用程序,它应该从蓝牙外围设备读取传感器值并将它们发送到后端服务器。为使该应用在屏幕关闭时也能正常工作,需要获取部分唤醒锁定,并将该应用置于电池优化白名单中。我知道只有在没有其他选项可用时才应该使用电池白名单,但对于我的用例,它似乎是唯一的解决方案,如本文末尾的表格所述:https ://developer.android .com/training/monitoring-device-state/doze-standby。该表指出,当“应用程序的核心功能是保持与外围设备的持久连接以提供外围设备互联网访问的目的”时,白名单是应用程序可接受的解决方案。

这准确地描述了我的用例。

但是,当我调试应用程序时,我可以看到唤醒锁定正在生效,因为当屏幕关闭并且蓝牙 API 仍在接收通知时,应用程序并未暂停。但是,查看几分钟后,wifi 停止工作,导致所有请求保持在“待处理”状态。使用移动网络而不是 wifi 时也会发生这种情况。我已经尝试缓冲接收到的数据,直到网络再次可用,但是我不认为这是一个有效的解决方案,因为在用户再次解锁他的设备之前应用程序可能会耗尽内存。

我已经读过,在 android 7 之前的 android 版本中,应用程序可以使用 wifi 锁来保持 wifi 为该特定应用程序工作。android 版本 8 或 9 中是否有类似的功能?或者我错过了设备设置中的配置选项以保持 wifi 唤醒?

由于在 android 开发者文章中描述了用例,因此建议有人确实已经实现了一个执行完全相同的事情的应用程序。是否有可用的代码示例演示如何实现这一点?

我的移动应用程序是使用cordova 实现的。我尝试了以下插件来让我的应用保持清醒:

  • 对于唤醒锁:cordova-plugin-powermanagement:1.0.5 或更高版本。

  • 提示用户将应用加入白名单:cordova-plugin-doze-optimize: 0.5.4 或更高版本。

0 投票
0 回答
133 浏览

android - 应用程序关闭时如何从服务器实时向安卓应用程序发送紧急警报?使用前台服务还是使用其他渠道?

当前实现: 当在服务器上生成事件时,我正在使用 FCM 向 android 应用程序发送通知,一些通知具有正常优先级,一些具有高优先级。当具有高优先级的通知发送到 android 应用程序时,应用程序会触发带有声音的自定义警报以通知用户有关事件。

它在 android 5,6,7 中运行没有任何问题。

问题: 在 android 8+ 的手机中,由于打盹模式和 App Stanby 模式,我面临延迟通知的问题,因此通知会按时发送,但在手机上接收延迟 20-25 分钟

我已经尝试过: 我已经完成了所有必需的设置,例如保持禁用省电、保持应用程序在后台运行、启用自动启动、启用优先级通知、还发送具有正常和高优先级的通知,但问题仍未解决。

我曾尝试使用前台服务,但在应用程序打开之前它一直处于活动状态,一旦应用程序关闭,服务就会停止。

即使应用程序关闭,如何从服务器实时向安卓应用程序发送紧急警报?使用前台服务还是使用其他渠道?

0 投票
1 回答
156 浏览

android - 在系统终止之前,Android 应用程序可以在后台运行多长时间(已关闭电池优化)?

我正在构建一个需要与外围设备进行持续蓝牙(经典)通信的 Android 应用程序。只要应用程序在前台运行,一切都很好。但是当应用程序被置于后台时,系统会在不确定的时间后终止应用程序。该应用程序可以在那里挂起 2 到 15 分钟。即使应用程序没有任何电池优化,也会发生这种情况。我希望通过关闭电池优化,它可以防止 Android 将应用程序置于待机模式/杀死它。

如果应用程序在设备使用电池运行时无法永远运行,那么人们可以期望应用程序在后台存在多长时间?

我希望应用程序在后台存在的持续时间是可确定的!我感谢任何关于此事的帮助。

在运行 Android 8.1.0 的摩托罗拉 G5S Plus 上测试

清单文件已打开 background_running: <meta-data android:name="android.app.background_running" android:value="true"/>

应用的目标 SDK 是 API 29:Android 10

0 投票
0 回答
172 浏览

android - Android 打盹模式杀死了前面的 MediaPlayer 服务

我一直在研究如何在后台(在线广播)中保持活跃的不断运行的音频播放。最后,我为它制作了前台服务,它适用于大多数手机,但不适用于三星 Android P 及更高版本......(如本文“前台服务限制”部分所示:https ://proandroiddev.com/ android-foreground-service-restrictions-d3baa93b2f70 ) 我听说有一个高级的音频播放工具叫做 ExoPlayer。这个库可以帮助我吗?

我已经尝试过这些解决方案:

  • 每 2 秒 ping 一次 google.com
  • 请求电池优化忽略
  • 为 mediplayer 设置唤醒锁: setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) (仍在使用)

启动服务:

服务本身:

}

通知创建:

如果您需要任何其他资源,请让我知道并尽可能提供帮助!我已经为这个问题苦苦挣扎了好几个星期了.. :(

更新 现在我每 2 分钟抛出一次媒体控制通知以更新之前的更新,因此该应用程序可以在受影响的手机上存活 30 分钟,但仍然不是一个有效的解决方案......

0 投票
1 回答
383 浏览

android - App Standby Buckets - “Never” 桶(桶 50)有什么限制

Android 文档提到了操作系统对以下每个存储桶的应用程序施加的限制:“活动”、“工作集”、“频繁”和“稀有” 。

我为“从不”存储桶(从未启动的应用程序启动的存储桶)找到的唯一文档提到:

此外,对于已安装但从未运行过的应用程序,还有一个特殊的 never 存储桶。系统对这些应用程序施加了严格的限制。

有谁知道操作系统对“从不”存储桶中的应用程序施加了哪些限制?(桶 50)

0 投票
1 回答
685 浏览

android - Android - 禁用 Forced DozeMode 或 AppStandByMode

我有一个使用 aForegroundService将位置更新发送到服务器的应用程序。基本上是一个跟踪器。

ForegroundService有一个Handler定期(使用postDelayed)执行一段代码来发送位置。

当应用程序处于前台甚至后台时,这工作得非常好,但我开始注意到手机锁定时出现延迟,屏幕关闭大约 15 分钟。我的意思是,15 分钟没有用户活动,也没有插入充电器。

这发生在Android Q (v10)设备上。我假设这也会发生在任何运行 Oreo 的设备上。

让我们说清楚......我的应用程序每 30 秒发送一次位置,但是当输入我认为是DozeModeAppStandByMode时,它​​会继续发送位置,但每 2 分钟(或多或少)。如果我打开屏幕或插入充电器,它会立即恢复到 30 秒的速度。这就是让我对DozeModeAppStandByMode 感兴趣的原因。此外,如果我不碰手机,但插入充电器,那么这永远不会发生。

如前所述,我很确定DozeModeAppStandByMode正在启动,我知道我可以将我的应用列入白名单以防止这种情况发生。但在更进一步之前,我想重现这一点,而无需每次我想测试我的应用程序的行为时等待这 15 分钟。

所以我“用谷歌搜索”了我如何强制这样做,这就是我发现的:

对于DozeMode(见来源

adb shell dumpsys 电池拔掉

adb shell dumpsys deviceidle step deep

并继续执行最后一条命令,直到达到IDLE状态。

对于AppStandByeMode(见来源

adb shell dumpsys 电池拔掉

adb shell am set-inactive packageName true

并使用其他命令查询状态:

adb shell am get-inactive packageName

我确认它返回Idle=true

我什至也按照其他博客的建议进行操作,发布:

adb shell dumpsys deviceidle force-idle

我虽然我没有进入这种模式,但现在看来我是而且我无法摆脱它......查看更新

更新

起初我以为我没有进入打盹模式......现在我可以确认我进入了,但它总是立即触发。(不再等待那 15 分钟)

每当我锁定手机并且屏幕熄灭时,它会自动进入打盹模式并开始间隔位置更新。我插上充电器,然后在 30 秒后再次发送。

我试过:

adb shell dumpsys deviceidle 解除强制

adb shell dumpsys deviceidle 禁用

adb shell dumpsys 电池重置

还是一样。

还:

  • 手机关机和电源备份
  • 卸载应用程序
  • 在应用程序设置中将电池优化更改为不优化

我错过了一步吗?

0 投票
2 回答
59 浏览

android - Is it possible for my GPS application to continue running in the background while the tablet is on standby?

I have created an application that generates a tracklog of the Android devices location. A GPS coordinate is recorded at regular intervals and stored on the device for later download. Currently, when the phone goes on standby, the program stops recording points. Is there a method that would allow the application to continue documenting location while the unit is on standby? Thanks in advance.

0 投票
0 回答
146 浏览

android - 在 Android 上的 webview 中保持套接字连接打开

我有一个 web 应用程序,现在通过在 webview 中启动它来在 Android 应用程序中使用它。大多数 Android 功能是原生的,webview 部分主要是通过 socket.io 进行通信

一切正常,但是一旦手机进入睡眠状态,它会在几分钟后终止套接字连接。此连接用于传入消息,因此我需要该连接才能保持活动状态。

我尝试创建一个前台服务并将其用作保持活动状态,但由于套接字连接在 webview 中,因此无论我做什么它仍然会关闭,即服务保持活动状态并且我可以建立一个新的网络连接,但我可以'不要让现有的应用程序连接保持活动状态。

当手机打瞌睡时,有没有办法让 webview 套接字连接保持活动状态?难道我做错了什么?还是我的设计有缺陷,我需要不同的方法?