37

我们目前正在开发一个 Android 应用程序,它是一个健身追踪器应用程序。它在后台持续运行,在大多数设备上运行良好,但我们一直遇到应用程序在某些三星设备上完全死机的问题。经过一番调查,似乎某些三星设备具有完全自定义的“应用程序优化”功能(http://forums.androidcentral.com/samsung-galaxy-s6/599408-app-optimisation-after-updating.html),其中基本上是打瞌睡功能的(非常)原始版本,存在于更高版本的 Android 中,如果应用程序三天没有使用,基本上只会谋杀应用程序。

由于这个应用程序或多或少只做日志记录,并没有打开活动,它给我们带来了一个大问题,因为这个功能在许多三星设备上都是预先启用的。这个问题是通过使用前台服务来解决的,但这是一个解决方案的大锤,需要通过不断的通知来打扰用户,我们真的不需要应用程序处于前台 - 我们可以使用正常的电源安卓管理。

三星应用程序优化功能明确表示,如果应用程序三天未使用,它将“优化”。有没有人了解三星认为“使用”的东西,我可以以某种方式触发它吗?

旁白:在我看来,这是一个实施得很糟糕的功能,使 Android 上的开发更具敌意。除了我们的用例之外,它还会破坏任何信使应用程序。如果不是因为 Facebook Messenger 和 Whatsapp 天生就可以豁免该应用程序,那么用户会发疯,因为这会破坏他们的体验。

4

7 回答 7

7

我拥有(并且目前拥有)三星设备,所以我从用户的角度了解它是如何工作的。技术规格及其在内部的工作方式是一个完全独立的问题,我无法回答。

系统可以检测您是否打开了应用程序。三星在他们的应用程序优化中使用了这一点,并将节省超过三天未使用的应用程序的电量。这是一个可怕的系统。

它忽略了可能对应用程序至关重要的后台进程,即使它是您积极使用的应用程序,例如健身追踪器,它也会有问题。引用应用程序优化列表中的内容:

“为节省电池电量,超过3天未使用的应用程序将被指定为省电。指定为省电的应用程序可能不会显示通知”

(来自挪威语的粗略翻译,最初取自运行 Android 6 的 S6)

因此,手动设置或自动设置(3 天不使用)的应用程序可能会给后台进程带来各种问题。但请记住,用户可以将任何应用程序设置为从不节省电池,并忽略自动设置。因此,考虑到这一点,让我们考虑可能的解决方案。

在一种情况下,您无需担心应用程序和应用程序优化:完全禁用应用程序优化时。

撇开这一点不谈,您实际上只能做两件事:

  1. 要求三星用户为您的应用禁用电池优化以防止出现问题

  2. 正如@MinaSamy 建议的那样(在他们现在已删除的答案中),SyncAdapter 并具有定期同步。请注意,我没有对此进行测试,所以我不知道它是否有效。

还有第三种选择,它确实不是一个解决方案,但你可以忽略它,赌应用优化被禁用,或者根本不关心它。

有没有人了解三星认为“使用”的东西,我可以以某种方式触发它吗?

据我所知,除非三星增加了一些防止意外打开的保护措施或增加了某种最低活动要求,否则打开就足够了。它似乎是一个“愚蠢”的功能,它运行在硬编码规则上,而不是一个动态系统,它实际检测应用程序的使用并设置与之相关的省电。它“易于启用”,但幸运的是也很容易禁用。

这意味着您无法触发使其保持活动状态的事件(除非 SyncAdapter 成功了)

为了使事实清楚,来自@Neil的回答

看起来用户可以做到这一点,所以必须有一些数据库或设置控制它。

有一点。总共有四个设置,其中三个是特定于应用程序的,它存储在数据库中(或其他形式的数据存储)。这四个设置虽然非常浅,但可以用来改变应用程序优化的行为:

  • 始终优化
  • 自动优化
  • 从不优化
  • 禁用应用优化

前三个选项基于每个应用程序,这意味着每个应用程序都可以有单独的设置。禁用应用程序优化正是您所期望的:它会禁用所有应用程序的整个功能。如果它被完全禁用,则没有任何优化。

还有一个网站列出了基于每个品牌绕过优化的方法。三星的入口或多或少就是我所说的:告诉用户手动禁用优化。没有开发人员解决方案。

于 2017-03-29T18:37:34.007 回答
2

在设置>设备健康>电池中有一个选项可以“让未使用的应用进入睡眠状态”。您可以将其关闭,或更改所需的时间,默认为 3 天。

听起来那是你的问题。

https://forums.androidcentral.com/samsung-galaxy-s10-s10-plus/964083-whats-disabling-some-my-apps-background.html

于 2019-11-07T17:25:24.773 回答
1

您是否有理由无法将您的服务添加到“不优化”列表中?

看起来用户可以做到这一点,所以必须有一些数据库或设置控制它。

或者,如果您检测到您正在其中一台设备上进行安装,请打开优化活动页面,并显示一条消息“不要优化我们!”。

于 2016-05-12T09:18:17.797 回答
0

在三星手机上,罪魁祸首是这个睡眠设置:

在此处输入图像描述

您必须将您的用户带到此系统设置屏幕并要求他们关闭该功能。

于 2020-04-15T16:22:46.820 回答
0

作为一种解决方法,我实现了 SyncAdapter 机制,使用这个链接作为一个很好的起点:https ://github.com/bmeike/MiniSync 它不能完美地工作(为了测试,在我的应用程序中我每 1 小时写一个日志,并且在 3 天后,它开始不遵守此调度),但至少在 3 天后它不会停止,无需将应用程序置于忽略优化模式。

更新:更新到 android PIE 后,调度在 3 天后再次停止。在另一台设备上,与 android Oreo 相同的应用程序,调度正在工作(即使没有完全遵守)。

于 2019-03-01T13:46:23.110 回答
-2

在我看来,您应该实现一个“广播接收器”,它侦听自定义“意图”,并且这个“意图”由“服务”的“onDestroy()”方法中的“服务”广播,因为当“系统” kill the 'Service' 这个方法肯定会被调用。当“广播接收器”收到“意图”时,您应该再次启动“服务”。为了区分您停止“服务”或“系统”停止“服务”,只需使用存储在“SharedPreferences”中的一些“布尔值”,然后在“广播接收器”中决定是否激活“服务”

于 2016-05-10T13:13:35.963 回答
-3

我们对 Android 的正常电源管理没问题

你是?来自 Android 文档

但是,由于用户不直接知道后台服务,因此在该状态下,它被认为是有效的终止候选者,您应该为这种情况做好准备。特别是,长时间运行的服务将越来越有可能被终止,并且如果它们保持启动足够长的时间,它们肯定会被终止(并在适当的情况下重新启动)。

三天似乎属于“长期运行......保证被杀死”。

如果问题不是您的服务被杀死而是它没有重新启动,您可以使用 AlarmManager 定期检查您的服务的状态并在必要时重新启动。

于 2016-04-25T21:51:31.920 回答