问题标签 [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.
android - 在高端手机上杀死最小的android前台服务
我正在尝试创建一个允许用户记录路线(位置/GPS)的应用程序。为了确保即使屏幕关闭也能记录位置,我foreground service
为位置记录创建了一个。我将位置存储在Room Database
使用Dagger2
.
但是,该服务被 Android 杀死了,这当然不好。我可以订阅内存不足警告,但这并不能解决我的服务在运行 Android 8.0 的现代高端手机上大约 30 分钟后被杀死的根本问题
我创建了一个只有“Hello world”活动和服务的最小项目:https ://github.com/RandomStuffAndCode/AndroidForegroundService
该服务是在我的Application
课堂上启动的,并且路由日志记录是通过以下方式启动的Binder
:
我可能不需要BIND_AUTO_CREATE
标志,我一直在测试不同的标志,试图不让我的服务被杀死——到目前为止还没有运气。
使用分析器,我似乎没有任何内存泄漏,内存使用量稳定在 ~35mb:
使用adb shell dumpsys activity processes > tmp.txt
i 可以确认foregroundServices=true
并且我的服务在 LRU 列表中列在第 8 位:
Proc # 3: prcp F/S/FGS trm: 0 31592:com.example.foregroundserviceexample/u0a93 (fg-service)
似乎不可能创建一个您可以信任不会被杀死的前台服务。所以,我们能做些什么?出色地...
- 将服务放在一个单独的进程中,试图让 Android 杀死 UI/Activity,同时不理会服务。可能会有所帮助,但似乎不能保证
- 将服务中的所有内容保存在例如Room数据库中。每个变量,每个自定义类,每次任何更改,然后使用
START_STICKY
. 这似乎有点浪费,并且不会导致非常漂亮的代码,但它可能会工作......有点。根据 Android 在杀死服务后重新创建服务所需的时间,很大一部分位置可能会丢失。
这真的是目前在 Android 后台做事的状态吗?没有更好的方法吗?
编辑:将应用程序列入白名单以进行电池优化(禁用它)不会阻止我的服务被杀死
编辑:使用Context.startForegroundService()
启动服务并不能改善情况
编辑:所以这确实只发生在某些设备上,但它始终在它们上发生。我想您必须做出选择,要么不支持大量用户,要么编写非常丑陋的代码。惊人的。
android - 带有处理程序的前台服务的 CPU 使用率
如何确保在应用程序关闭、屏幕锁定和打盹模式处于活动状态时前台服务可以使用 CPU?
有一些处理程序线程,我在前台服务中使用 postdelayed 方法计划任务。我列出了我的测试用例:
- 前台服务中的部分唤醒锁:
处理程序从不延迟。 - 没有唤醒锁,设备通过 adb 连接:
处理程序从不延迟。(打盹模式,后台情况,屏幕锁定都试过了。) - 没有唤醒锁,应用程序在屏幕上:
处理程序从不延迟。 - 没有唤醒锁,后台应用程序,应用程序未销毁:
处理程序可能会延迟。 - 没有唤醒锁、屏幕开启、应用程序被破坏:
处理程序可能会延迟。 - 没有唤醒锁,屏幕锁定:
处理程序总是在不知不觉中延迟。 - 没有唤醒锁,打盹活动:
处理程序总是在不知不觉中延迟。
文档没有太多关于前台服务 cpu 使用限制的说明。是否存在与前台服务相关的错误?
android - Android,如何在 idle_maintenance 模式下检测并执行任务?
当设备处于打盹模式时,我需要发送跟踪信息。
根据page monitoring-device-state有idle 和idle_maintenance,我知道当它在idle_maintenance 窗口时,应用程序可以执行任务。在我的情况下,我想获取跟踪信息并发送到我的服务器,但是当有空闲或 idle_maintenance 窗口时,我的应用程序处于阻塞状态。
如何在模式 idle_maintenance 下执行任务?
或者
我可以使用什么库?
或者
有什么例子吗?
首先,谢谢。
android - 如何在设备移动时覆盖打盹模式?
我正在编写一个应用程序,即使应用程序关闭,它也需要以特定时间间隔轮询位置。我目前正在使用 Firebase JobDispatcher 来完成工作。代码如下:
我的要求如下:
1)如果手机正在充电,则需要不断轮询位置(正在发生)
2)如果手机静止在同一位置,则应用不得轮询(当应用进入打盹模式时也会发生这种情况)
3)如果手机在行驶的汽车中保持静止(或者如果手机在骑自行车时保持静止在某人的口袋中),则需要连续轮询该位置(这没有发生,这是问题)。
当电话放在行驶的汽车内时,如何让工作调度员进行轮询?
android - 即使从“未优化的应用程序”中删除 PowerManager.isIgnoringBatteryOptimizations 也始终返回 true
我有一个里程日志应用程序,它可以进行 GPS 跟踪,并且能够在后台建立与汽车的 OBDII 连接。
现在我想显示一个弹出窗口,通知用户如果我的应用程序没有被列入白名单,因为这可能会停止我的后台(实际上是前台)服务......
我愿意:
但 PowerManager.isIgnoringBatteryOptimizations 始终返回“true”,即使它再次从“未优化的应用程序”中删除。仅当我卸载应用程序'false' 再次返回...在 Galaxy Note 8 (Android 8.0) 和 Emulator 8.1 上测试
问题很简单:这是一个错误吗?或者如何从白名单中删除应用程序,以便 PowerManager.isIgnoringBatteryOptimizations 再次返回“假”?
android - 即使在打瞌睡模式下也每 15 秒获取一次位置
我想每 15 秒获取一次位置,一切正常,但是在打瞌睡模式(深度睡眠)下,我的处理程序无法正常工作,是吗?AlarmManager 是个好方法,但时间限制为 1 分钟,在打盹模式下不重复。
接收者 :
android - 从 FCM 启动活动
在我的应用程序中,当收到高优先级 FCM 消息时,我需要启动一个活动并打开屏幕。这是一个警报活动,对用户来说非常非常重要。在大多数 Android 设备上,代码运行良好。但是,在某些华为或 LG 设备上,当设备处于打盹模式或放在口袋中(接近传感器)时,活动不会启动。行为应该类似于闹钟、电话等。这是我的代码:
FirebaseMessagingService:
报警活动:
我想在启动活动之前使用SCREEN_BRIGHT_WAKE_LOCK,但它已被弃用。
android - 在打盹模式下在前台服务中重复任务
我正在开发一个应用程序,在该应用程序中,我必须以固定的时间间隔(比如说 2 分钟后)执行一些重复任务,即使在打瞌睡模式下也应该完成。我的观察在下面提到 -
- 使用警报(使用 RTC 标志)执行重复任务是不准确的。Android系统批量报警。如果我们使用 RTC_WAKEUP 那么它比 RTC 更好,但它在 Android Vitals 中显示 WAKEUP 计数不好。
- Jobscheduler 很有用,但不会在 2 分钟等更短的时间间隔内工作。我曾尝试过 Firebase Jobdispatcher,但这也不是很准确,我以 2 分钟的触发时间开始了 Job,但它在 10-20 分钟之间变化。
- 使用处理程序和计时器在前台服务中重复任务。在这种情况下,前台服务继续以打盹模式运行,但处理程序和计时器停止重复任务。我阅读了 Handlers.postDelayed() 并发现这也受打盹模式的影响。
我不想为这个重复任务获取 WAKELOCK。
有人可以建议我一些更好/更干净的方法,我们可以在打瞌睡模式下做短间隔重复任务吗?
以供参考 -
mqtt - 打盹模式与 MQTT 连接丢失
当Android设备进入Doze模式时,MQTT中会触发connectionlost回调
到目前为止我已经尝试了什么?
1.Written广播接收器检测应用程序是否进入打盹模式。
2.一旦进入,做部分唤醒锁定。
我的问题是?
有什么方法可以让我的应用程序始终连接到互联网,以确保我的应用程序用户不会错过任何通知。
android - Oreo 无限后台服务,例如 Messenger 或 Instagram
如何创建infinite background service
无通知,如 Messenger、Instagram 或 HID Mobile Access?
例如,HID Mobile Access 具有无限运行的后台服务,不会被系统杀死,没有通知,并且在从最近的应用程序列表中删除应用程序时不会重新启动。
有什么技巧可以做到这一点,或者谷歌是否有非官方支持的应用程序?