我们目前正在开发一款适用于健身追踪应用的Android应用。它在后台不断运行,并且在大多数设备上运行良好,但我们一直在使应用程序在某些三星设备上完全死机。经过一番调查,似乎有些三星设备有一个完全自定义的“应用程序优化”功能(http://forums.androidcentral.com/samsung-galaxy-s6/599408-app-optimisation-after-updating.html),它基本上是Doze功能的一个(非常)原始版本,存在于Android的更高版本中,基本上只是谋杀应用程序已经三天没用过了。
由于此应用程序或多或少仅执行日志记录,并且未打开活动,因此对我们来说存在很大问题,因为此功能已在许多三星设备上预先启用。通过使用前台服务解决了这个问题,但这是一个解决方案的大锤,需要通过持续通知来扰乱用户,而且我们真的不需要应用程序处于前台 - 我们对正常的电源没问题管理Android。
三星应用程序优化功能明确指出,如果应用程序未使用三天,它将“优化”应用程序。有没有人了解三星认为“被使用”的东西,我能以某种方式触发吗?
侧面咆哮:在我看来,这是一个糟糕的实现功能,使Android上的开发更具敌意。除了我们的用例,它将会破坏任何信使应用程序。如果不是因为Facebook Messenger和Whatsapp很难被豁免应用,那么用户就会疯狂,因为这会破坏他们的体验。
我拥有(现在拥有)三星设备,所以我从用户的角度了解它的工作原理。技术规范及其在内部的工作方式是一个完全独立的问题,我无法回答。
系统可以检测您是否打开了应用程序。三星在他们的应用程序优化中使用它,并将节省超过三天未使用的应用程序的功能。虽然这是一个糟糕的系统。
它忽略了可能对应用程序至关重要的后台进程,即使它是您主动使用的应用程序,如健身追踪器,也会出现问题。引用app优化列表中的内容:
“为节省电池电量,将指定未使用超过3天的应用程序以节省电量。指定用于节省电量的应用程序可能不会显示通知”
(来自挪威语的粗略翻译,最初取自运行Android 6的S6)
因此,手动或自动设置的应用程序(3天不使用)可能会给后台进程带来各种问题。但请记住,用户可以将任何应用程序设置为永不节省电池,并忽略自动设置。因此,考虑到这一点,让我们考虑可能的解决方案。
有一种情况您无需担心应用和应用优化:完全禁用应用优化时。
放在一边,你真的只能做两件事:
而且还有第三个选项,它实际上不是一个解决方案,但你可以忽略它并且赌博应用程序优化被禁用,或者根本不关心它。
有没有人了解三星认为“被使用”的东西,我能以某种方式触发吗?
据我所知,除非三星增加一些防止意外开启的保障或增加某种最低活动要求,否则开放就足够了。它似乎是一个“愚蠢”的功能,它运行在硬编码规则上,而不是动态系统,它实际上检测应用程序使用并设置相对于此的节电。它“易于启用”,但幸运的是也很容易禁用。
意思是你不能触发一个让它保持活动的事件(除非SyncAdapter能够解决这个问题)
并且从@Neil's answer了解事实:
用户似乎可以这样做,所以必须有一些数据库或设置控制它的地方。
有点儿。总共有四个设置,其中三个是特定于应用程序的,并且存储在数据库(或某种其他形式的数据存储)中。可以使用这四种设置(尽管非常浅)来改变应用优化的行为:
前三个选项基于每个应用程序,这意味着每个应用程序可以有单独的设置。禁用应用优化正是您所期望的:它会禁用所有应用的整个功能。如果它被完全禁用,则不会优化任何内容。
您是否有理由无法将服务添加到“不优化”列表中?
用户似乎可以这样做,所以必须有一些数据库或设置控制它的地方。
或者,如果您检测到您正在其中一个设备上安装,请打开优化活动页面,并显示一条消息“不要优化我们!”。
在我看来,你应该实现一个'广播接收器'来监听一个自定义的'意图',这个'意图'将由'服务'从'服务'的'onDestroy()'方法广播,因为当'系统'杀死'服务'这个方法肯定会被调用。当“广播接收器”收到“意图”时,您应该再次启动“服务”。要区分你停止'服务'或'系统'停止'服务'只是使用存储在'SharedPreferences'中的一些'布尔',然后在'广播接收器'中你决定是否激活'服务'
作为一种解决方法,我实现了SyncAdapter机制,使用此链接作为一个很好的起点:https://github.com/bmeike/MiniSync它不能完美地工作(对于测试,在我的应用程序中我每隔1小时写一个日志,并且在3天后,它开始不尊重这个调度),但至少它不会在3天后停止,而无需将应用程序置于忽略的优化模式。
更新:更新到Android PIE后,调度在3天后再次停止。在另一台设备上,与android Oreo相同的应用程序,调度工作(即使没有完全遵守)。
我们对Android的正常电源管理很好
你是?来自Android文档
但是,由于用户没有直接了解后台服务,因此在该状态下,它被认为是有效的候选者,您应该为此做好准备。特别是,长期运行的服务将越来越可能被杀死,并且如果它们保持足够长的时间,则可以保证被杀死(如果合适,可以重新启动)。
三天似乎会陷入“长期奔跑......保证被杀”。
如果问题不在于您的服务被终止但未重新启动,则可以使用AlarmManager定期检查服务状态并在必要时重新启动。