问题标签 [android-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.

0 投票
2 回答
2819 浏览

android - 省电+电话意图=>没有互联网?

注意:事实证明,原始问题的假设不正确。在底部查看有关其编辑的更多详细信息。

现在是关于节电模式,而不是节电模式和打盹模式。它也不是关于 Service&BroadcastReceiver,而只是 BroadcastReceiver。

背景

从 Android Lollipop 开始,Google 引入了新的手动和自动方式来帮助节省电池:

“打盹”模式和“省电模式”。

在某些情况下,由于这些技术,应用程序可能无法访问 Internet。

问题

我正在开发一个需要使用在特定情况下触发的后台服务访问 Internet 的应用程序,如果收到重要的信息,它会显示一些 UI。

作为用户,我注意到在某些情况下,它无法访问 Internet。

应用程序是否可以访问互联网的检查是这样的:

问题是我需要检查为什么有时会返回 false,因此如果失败,我们应该告诉用户(可能通过通知)数据无法访问,因为设备限制了应用程序,并为用户提供从电池优化中将应用列入白名单。

我不确定哪些会影响这一点:打瞌睡、省电模式,或两者兼而有之,如果总是这样,对于所有设备,在所有情况下。

我试过的

我找到的是如何查询打盹模式和省电(省电)模式:

我想我还找到了一种在连接到设备时检查它们的方法:

省电:

打瞌睡状态:

和 :

问题

简而言之,我只想知道无法访问互联网的原因是否确实是因为没有互联网连接,或者应用程序当前是否由于某些电池优化而受到限制。

仅在受到限制的情况下,我可以警告用户,如果他没问题,该应用程序将被列入白名单,以便它仍然可以正常工作。

以下是我对此的疑问:

  1. 以上哪项阻止了应用程序的后台服务访问互联网?都是造成的吗?它是特定于设备的吗?“互动”会影响它吗?

  2. 如果已经有办法进入“轻度”和“深度”打瞌睡状态,那么“强制空闲”是什么?还有没有办法将打盹模式重置为正常?我尝试了多个命令,但只有重新启动设备才真正让它恢复正常......

  3. 我创建的 BroadcastReceiver 是否允许正确检查?是否会在所有情况下触发由于所有特殊情况而拒绝访问 Internet?我不能在清单中注册它是真的吗?

  4. 是否可以检查无法访问互联网的原因是否确实是因为没有互联网连接,或者应用程序当前是否由于某些电池优化而受到限制?

  5. Android O 上特殊情况下后台服务的互联网连接限制有变化吗?也许我应该检查更多的情况?

  6. 假设我将服务更改为在前台运行(带有通知),这是否涵盖所有情况,并且始终可以访问 Internet,无论设备处于什么特殊状态?


编辑:似乎这根本不是服务的错,而且它也发生在省电模式下,没有打盹模式。

该服务的触发器是一个侦听电话事件的 BroadcastReceiver,即使我在其onReceive函数上检查 Internet 连接,我也看到它返回 false。从它启动的服务也是如此,即使它是前台服务。查看 NetworkInfo 结果,它是“BLOCKED”,它的状态确实是“DISCONNECTED”。

现在的问题是,为什么会发生这种情况。

这是一个新的示例 POC 来检查这一点。要重现,您需要打开省电模式(使用./adb shell settings put global low_power 1命令或以用户身份),然后启动它,接受权限,关闭活动,然后从另一部手机呼叫此手机。您会注意到,在活动上,它显示有 Internet 连接,而在 BroadcastReceiver 上,它说没有。

请注意,连接到 USB 数据线时可能会自动关闭省电模式,因此您可能需要在未连接设备时尝试一下。与启用它的用户方法相反,使用 adb 命令可以防止它。

示例项目也可以在这里找到,尽管它最初是关于打盹模式的。只需使用节电模式,即可查看问题是否发生。

电话广播接收器

显现

MainActivity.java

0 投票
0 回答
431 浏览

android - 每次闹钟响起时使用 setExactAndAllowWhileIdle() 手动设置新闹钟:Android

我知道这已经被问过好几次了,但是直到现在我还没有找到适合我的东西。我正在使用 setRepeating() 来安排警报管理器每分钟运行一次。但是,在 Android 6.0 打盹模式之后,这已停止工作。我也尝试过使用 setExactAndAllowWhileIdle(),但它似乎没有重复,因为它不是 setexactRepeating。

下面是我的代码,

我需要每分钟调用一次 ServiceToUpdateWidget。即使手机进入深度睡眠或打盹模式,有没有办法做到这一点。我可以为此使用计时器或倒计时吗?thry 会在打盹模式下工作吗?

我已经浏览了许多链接,如下所示,

但是,我仍然无法每分钟调用一次我的服务。

我也尝试过使用alarmManager.setAlarmClock(),仍然没有运气。

我找到了一个链接,上面写着:https ://www.reddit.com/r/androiddev/comments/40ci7v/how_to_set_the_repeating_alarm_which_will_work/

“每次闹钟响起时,您都必须手动设置新闹钟它。”

当以前的警报敌人关闭时,如何手动设置新警报?请问,有人可以帮忙吗?

0 投票
1 回答
660 浏览

android - 电池优化白名单不会阻止 Doze 推迟我的应用

我的应用每 15 分钟向我的服务器发送 GPS 位置数据。此功能是应用程序的核心目的。

但是,当手机关闭且未使用时,GPS 记录会逐渐减少。GPS 记录之间的时间间隔是 15 分钟,然后是 1 小时、2 小时、4 小时、6 小时,然后当我移动手机或打开手机时又回到 15 分钟。

这似乎是由于 Android 6 中引入的打盹模式造成的。我将该应用程序添加到了电池优化白名单中,但这并没有产生任何影响,尽管文档声称并非如此

  1. 为什么白名单在这种情况下没有帮助?
  2. 我应该怎么做?定期唤醒锁会延迟并因此防止打瞌睡吗?

    /li>
0 投票
3 回答
5162 浏览

android - 在打盹模式下获取位置更新

在打瞌睡模式下,我试图在我的 android 应用程序中获取位置更新,这曾经适用于 android 5.x。随着 android 6 和 doze 的出现,无论我做什么,更新都会在某个时候停止。在阅读了有关该主题的几篇文章和 stackoverflow 答案后,我进行了以下更改:

  • 使我的服务成为前台服务
  • 使服务持有部分唤醒锁
  • 我已授予我的应用 WAKE_LOCK 权限
  • 使服务在单独的进程中运行(用于解决某些 android 错误)
  • 我为我的应用禁用了电池优化

但是,当打瞌睡开始时,我仍然没有收到位置更新。我已经验证了我的服务线程在打瞌睡开始时继续运行(通过定期记录消息),但是位置管理器以某种方式停止发送更新。在这方面,关于打瞌睡和 LocationManager 的文档非常少,所以我想知道是否有人知道让位置管理器在打瞌睡中保持活力的方法?LocationManager 上是否有一些方法,如果定期调用将使 LocationManager 保持活动状态?请注意,我只对 GPS 更新感兴趣,更新频率很高,每秒一次。

0 投票
1 回答
697 浏览

android - 使用启用的省电模式管理 Android Nougat 或 Android Oreo 上的 Internet 连接

当设备使用启用的节电模式解锁时,我无法在新的 Android 版本上正确管理 Internet 连接。

android.permission.INTERNET 和 android.permission.ACCESS_NETWORK_STATE 权限被添加到清单文件中。

我注册收到的广播以在 Activity 启动时收听 ConnectivityManager.CONNECTIVITY_ACTION 并在停止时取消注册。当手动禁用\启用 Wi-FI 或蜂窝连接时,它可以完美运行。

我也使用方法来检查连接

每次手机解锁并且我的应用程序在前台时 isNetworkAvailable() 方法返回已连接但未连接。

我试图实现类似 ping 逻辑的东西,但是在解锁手机后,我收到的电话一直没有连接,直到禁用节电模式

有人知道如何处理 Android 7 和 Android 8 上的连接的好解决方案吗?

预先感谢

源代码 活动:

我的连接管理器实现:

0 投票
1 回答
1396 浏览

android - 检查应用程序是否从电池优化中列入白名单(打盹模式)

如何检查我的应用程序是否已在其设置中从电池优化(打盹模式)列入白名单?谢谢你。

0 投票
1 回答
128 浏览

android - Android Doze:它会单独影响整个应用程序或其进程吗?

我需要收集 GPS 数据,将其保存到数据库,然后每分钟将其发送到后端。我只是想确保打盹模式不会搞砸。

  1. 假设我启动了前台服务并onLocationChanged在那里实现了回调。

    我是否必须在前台服务中执行所有这些操作(收集/存储/发送)才能确保 Doze 允许使用 GPS / 互联网?

  2. 如果我想在其他地方存储/发送数据,例如在 aBroadcastReceiver中,我如何确定我BroadcastReceiver的已准备好处理数据并且没有睡着?

  3. Android M 中有一个 bug,导致前台服务受 Doze 模式影响: https ://stackoverflow.com/a/37869501/3210556

    一种可能的解决方法是在单独的进程中启动前台服务。

    假设应用程序中有前台服务,究竟什么不受打瞌睡的影响?

    • 前台服务本身?
    • 与前台服务相关的进程?
    • 整个应用程序?

谢谢你。

0 投票
1 回答
416 浏览

android - 在打盹模式下定期跟踪用户

我想在特定时间段和特定时间跟踪用户。我每 2 分钟启动一次警报管理器(我从服务器获取周期性时间,这在我的应用程序中是动态的)并尝试获取大约一分钟的位置,之后我停止获取位置并保存在 DB 上获取的位置。无论如何,这种方法运行得很好,但在 api 级别 23 及更高级别,我的打瞌睡和待机模式应用程序无法正常运行,也不能在特定时间调用警报!我使用setExactAndAllowWhileIdle了 api 级别 23 及以上的方法,但效果不佳。

文件说,我不能在打瞌睡和待机模式下使用更多警报。我的问题是,如何在 android 6 及更高版本中跟踪用户?

0 投票
2 回答
762 浏览

android - Android 应用出现在电池优化白名单中,但实际上并不存在

背景:

我正在开发一个 Android 应用程序。当应用程序启动时,它会使用该isIgnoringBatteryOptimizations()功能检查它是否被排除在电池优化之外。如果该函数返回 false,我将使用该REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限显示电池优化设置屏幕,用户应在其中将应用添加到白名单。

当我从 Android Studio 运行应用程序时,这一切都完美无缺。当我下载并安装候选版本时,麻烦就开始了。

请注意,我将描述的问题仅发生在我的两部手机中的一部上。该问题发生在运行 Android 7.0 的 Sharp 507SH 上。在同样运行 Android 7.0 的 Sony SOV32 上不会发生此问题。

问题:

当我下载并安装候选版本(不使用 Android Studio)并启动应用程序时,电池优化屏幕正常显示。但是,该应用程序似乎已立即列在“未优化”白名单中。通常,用户必须手动选择应用程序并添加它。但它出现在列表中。所以用户按下后退按钮返回应用程序,一切似乎都很好。但是,该应用程序实际上不在白名单中。应用程序每次启动时都会提示用户这一事实证实了这一点,即isIgnoringBatteryOptimizations()仍然返回 false。

我可以通过首先进入电池设置并将其从白名单中删除,然后将其添加回来,将应用程序“真正”添加到白名单中。然后提示会消失。

0 投票
1 回答
4984 浏览

android - 如何应对华为和小米的“电池优化”

我有一个应用程序可以通过NotificationListenerService. 我的应用程序在几乎任何手机上都能在打盹模式和应用程序待机状态下存活(如果设置正确,例如异常或前台服务)。

然后是华为和小米对 Android 进行了自己的修改,以“提高电池寿命”。这些可能会严重干扰后台运行的应用程序,以至于一两周后必须重新安装应用程序。即使清除数据也不会“解冻”应用程序。即使是他们自己的“优化”的例外也不能可靠地解决这个问题。只有完全禁用所有优化,例如启用“高性能模式”才能解决此问题。但用户不想禁用这些选项。

您如何处理这些案件?我们如何才能阻止制造商停止搞乱核心 Android?更不用说有趣的 ANR 和崩溃了Zygote:(