打盹模式 - 前台服务是不是继续运行?

Posted

技术标签:

【中文标题】打盹模式 - 前台服务是不是继续运行?【英文标题】:Doze mode - do foreground services continue to run?打盹模式 - 前台服务是否继续运行? 【发布时间】:2019-11-13 22:45:18 【问题描述】:

我很困惑reading this 并试图弄清楚当设备进入深度打盹模式时前台服务是否会运行。有人可以澄清一下。我想知道前台服务是否可以继续运行。我一直认为当设备休眠时所有线程都被暂停,即使是前台服务。

我看到了doze mode restrictions,但没有看到前台服务。如果我的服务超过打盹模式安全设置,我会很困惑。

据我所知,打瞌睡模式限制只是停止了网络调用。但是可以说我正在做一些长时间运行的主线程工作,这意味着它可以继续运行吗?即使在打瞌睡模式下?

【问题讨论】:

【参考方案1】:

前台服务在打盹模式下不会被终止,这是一个很好的解决方法来覆盖打盹模式。 杀死前台服务高度依赖于移动操作系统。 和华为一样,它会在一段时间后将前台服务杀死,您将无法确定周期。 如果检测到意外的电池消耗,其他一些电话会终止最旧的前台服务。 去年,我花了大约 6 个月的时间观察手机在打盹模式是否激活时杀死前台服务的行为。 我尝试了不止一种解决方案来覆盖打瞌睡模式,每 10 秒检测一次位置,最好的一种是前台服务。 因此,您会在某些手机上遇到意外行为,但它是打盹和待机模式的最佳解决方案。 你可以看到这个article 也可以看看这个tutorial

【讨论】:

我需要定期在wear os上执行网络调用,为此我开发了一个简单的runnable,它以固定速率将自己发布到一个线程中,并将它作为私有成员放入前台服务中,它在调用 startService 时开始运行。 30 分钟后,正确的行为停止,不执行调用,但前台服务保持活动状态。从那时起,每次我打开屏幕时,正确的行为都会恢复并在屏幕关闭时再次停止。有什么想法吗? @AndreaNisticò 和我一样,我在前台服务上保持套接字存活。大约 15 分钟设备被锁定后,套接字连接断开,并且由于设备手动唤醒或由于其他应用程序的通知(如 whatsapp)而重新连接套接字。 @ShivamSharma 我找到了一个解决方案:在您的前台服务开始时获取部分唤醒锁并且永远不会释放它,此外,我正在单独的进程中启动前台服务。这样,只要服务存在,我就可以运行网络调用 @AndreaNisticò 感谢兄弟的回复。您能否准确地分享您尝试过的代码 sn-p。我正在通过 jobScheduler 作业运行前台服务(它无限运行,因为我从未完成该作业)。而且我还在 onStartCommnad() 中放置了一个部分唤醒锁,并且永远不会释放它。我已经在一个单独的线程上启动了jobscheduler,并且我已经将前台服务的套接字部分放在了单独的线程中。我正在测试红米(奥利奥),一加(派)。我已经监控了使用和不使用终端命令的行为。 @AndreaNisticò 我有一个 VoIP 呼叫 SDK 模块,我在其中通过作业调度程序运行此前台服务。我试图将前台服务作为 Manifest 文件中的一个进程提及,但服务内的代码正在运行。但是一旦连接了套接字,我就会在回调事件中向应用程序模块(即默认进程)返回一个成功值。因此,在这个实验中,单独的进程没有与默认进程通信。尽管正在生成粘性通知,但我也无法调试前台服务中的代码。你能帮帮我吗???【参考方案2】:

打盹模式用于节省电池电量。您应该将您的应用列入白名单以停用打盹模式。

来源:https://developer.android.com/training/monitoring-device-state/doze-standby

支持其他用例 几乎所有应用程序都应该能够通过正确管理网络连接、警报、作业和同步以及使用 FCM 来支持打盹 高优先级消息。对于一组狭窄的用例,这可能不是 就足够了。对于这种情况,系统提供了一个可配置的 部分免除 Doze 和 App Standby 的应用程序白名单 优化。

An app that is whitelisted can use the network and hold partial wake locks during Doze and App Standby. However, other restrictions

仍然适用于列入白名单的应用,就像它们适用于其他应用一样。为了 例如,白名单应用的作业和同步被延迟(在 API 23 级及以下),并且其常规 AlarmManager 警报不会触发。 应用程序可以通过以下方式检查其当前是否在豁免白名单中 调用 isIgnoringBatteryOptimizations()。

以及如何将您的应用插入白名单: 1. Step --> 在你的xml文件中添加这个权限。

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

2.Step İgnore 电池优化

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
    Intent intent = new Intent();
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) 
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    

【讨论】:

这不是要问的问题。 这会阻止服务被杀死吗? 不清楚。我错误地理解了这个问题。对不起。我猜:它问我,如何防止打瞌睡模式。不是如何防止服务进入打盹模式。 idk 关于这一点,似乎我的应用程序仍然在打盹模式下延迟了它的工人(意思是workermanager.equeue() 在我解锁设备之前不会触发)即使在电池优化白名单上也是如此。 FWIW,我在 Pixel XL (android 10) 上进行测试 workermanager 不是前台服务,WorkManager.Task 遵循打盹模式

以上是关于打盹模式 - 前台服务是不是继续运行?的主要内容,如果未能解决你的问题,请参考以下文章

打盹模式如何影响后台/前台服务,有/没有部分/全部唤醒锁?

在打盹模式下在前台服务中重复任务

Android O 在打盹模式下前台服务未接收位置更新

打盹模式处理

Android 7.0 (Nougat) 打盹模式停止 Web 服务

最频繁触发Android接收器?