三星“应用优化”功能会在3天后杀死后台应用程序

时间:2016-04-25 20:08:45

标签: android android-service android-alarms android-wake-lock samsung-touchwiz

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

由于此应用程序或多或少仅执行日志记录,并且未打开活动,因此对我们来说存在很大问题,因为此功能已在许多三星设备上预先启用。通过使用前台服务解决了这个问题,但这是一个解决方案的大锤,需要通过持续通知来扰乱用户,而且我们真的不需要应用程序处于前台 - 我们对正常的电源没问题管理Android。

三星应用程序优化功能明确指出,如果应用程序未使用三天,它将“优化”应用程序。 是否有人对三星认为“使用”的内容有所了解,我能以某种方式触发吗?

侧面咆哮:在我看来,这是一个糟糕的实现功能,使Android上的开发更具敌意。除了我们的用例,它将会破坏任何信使应用程序。如果不是因为Facebook Messenger和Whatsapp很难被豁免应用,那么用户就会疯狂,因为这会破坏他们的体验。

7 个答案:

答案 0 :(得分:7)

我拥有(现在拥有)三星设备,所以我从用户的角度了解它的工作原理。技术规范及其在内部的工作原理是一个完全独立的问题,我无法回答。

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

它忽略了可能对应用程序至关重要的后台进程,即使它是您主动使用的应用程序,如健身追踪器,也会出现问题。引用它在app optimization-list中的内容:

  

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

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

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

有一种情况您无需担心应用和应用优化:完全禁用应用优化时。

除此之外,你真的只能做两件事:

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

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

  3. 而且还有第三个选项,它实际上不是一个解决方案,但你可以忽略它并赌博应用程序优化被禁用,或根本不关心它。

      

    有没有人了解三星认为是"使用过的"我可以以某种方式触发吗?

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

    意味着您无法触发将使其保持活动的事件(除非SyncAdapter执行此操作)

    @Neil's answer

    中明确事实
      

    用户似乎可以这样做,所以必须有一些数据库或设置控制它。

    有点儿。总共有四个设置,其中三个是特定于应用程序的,并且存储在数据库(或某种其他形式的数据存储)中。可以使用这四种设置(尽管非常浅)来改变应用优化的行为:

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

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

答案 1 :(得分:1)

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

用户似乎可以这样做,所以必须有一些数据库或设置控制它的地方。

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

答案 2 :(得分:1)

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

听起来像是您的问题。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

作为一种解决方法,我使用此链接作为一个很好的起点来实现SyncAdapter机制:https://github.com/bmeike/MiniSync 它无法正常运行(为了进行测试,在我的应用中,我每1小时写一次日志,三天后,它开始不遵守此计划),但至少三天后它不会停止,无需放置该应用处于忽略的优化模式。

更新:更新到android PIE后,计划在3天后再次停止。 在另一台设备上,与Android Oreo相同的应用程序,可以进行调度(即使不完全遵守)。

答案 5 :(得分:0)

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

enter image description here

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

答案 6 :(得分:-1)

  

我们对Android的正常电源管理很好

你是吗?来自Android文档

  

但是,由于用户没有直接了解后台服务,因此在该状态下它被认为是有效的候选者,您应该为此做好准备。特别是,长期运行的服务将越来越可能被杀死,并且如果它们保持足够长的时间,它们将被保证被杀死(并在适当时重新启动)。

三天似乎会落在"长期运行......保证会被杀死#34;

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