web-dev-qa-db-fra.com

La fonctionnalité "d'optimisation des applications" de Samsung tue les applications d'arrière-plan après 3 jours

Nous développons actuellement une application Android qui est une application de suivi de la condition physique. Il fonctionne en permanence en arrière-plan et fonctionne correctement sur la plupart des appareils, mais nous avons eu des problèmes avec l'application en train de mourir complètement sur certains appareils Samsung. Après quelques recherches, il semble que certains appareils Samsung disposent d'une fonction "Optimisation d'application" totalement personnalisée ( http://forums.androidcentral.com/samsung-galaxy-s6/599408-app-optimisation-after-updating.html ), qui est fondamentalement une version (très) primitive de la fonctionnalité Doze qui existe dans les versions ultérieures d’Android et qui assassine essentiellement les applications si elles ne sont pas utilisées depuis trois jours. 

Comme cette application utilise plus ou moins la journalisation et n'ouvre pas l'activité, elle constitue un gros problème pour nous, car cette fonctionnalité est pré-activée sur de nombreux appareils Samsung. Le problème est résolu en utilisant un service de premier plan, mais il s'agit d'une solution qui nécessite de déranger l'utilisateur avec une notification constante, et nous n'avons vraiment pas besoin que l'application soit au premier plan - nous sommes d'accord avec le pouvoir normal gestion d'Android. 

La fonctionnalité d'optimisation des applications Samsung indique clairement qu'elle "optimisera" les applications si elles ne sont pas utilisées depuis trois jours. Quelqu'un a-t-il un aperçu de ce que Samsung considère comme "utilisé" et puis-je le déclencher?

Side-rant: À mon avis, il s'agit d'une fonctionnalité mal implémentée qui rend le développement sur Android plus hostile. Outre notre cas d'utilisation, toutes les applications de messagerie seront interrompues. Sans le fait que Facebook Messenger et Whatsapp sont câblés pour être exemptés de l'application, les utilisateurs deviendraient fous, car cela briserait leur expérience. 

30

Je possède (et possède actuellement) des appareils Samsung. Je connais donc un peu son fonctionnement du point de vue de l'utilisateur. Les spécifications techniques et leur fonctionnement à l’intérieur sont une question totalement distincte, à laquelle je ne peux pas répondre.

Le système peut détecter si vous ouvrez une application. Samsung utilise cela dans l'optimisation de leurs applications et économisera de l'énergie sur les applications qui n'ont pas été utilisées depuis plus de trois jours. C'est un système terrible cependant.

Il ignore les processus d'arrière-plan qui peuvent être critiques pour les applications. Même s'il s'agit d'une application que vous utilisez activement, comme un outil de suivi de la condition physique, des problèmes se poseront. Pour citer ce qu'il dit à l'intérieur de la liste d'optimisation d'applications:

"Pour économiser l'énergie de la batterie, les applications qui ne sont pas utilisées depuis plus de 3 jours seront désignées pour économiser l'énergie. Les applications désignées pour économiser l'énergie risquent de ne pas afficher de notifications"

(Traduction approximative du norvégien à l’origine d’un S6 sous Android 6)

Par conséquent, les applications qui ont été définies manuellement ou automatiquement (3 jours d'inactivité) peuvent poser divers problèmes avec les processus en arrière-plan. Mais rappelez-vous que l'utilisateur peut configurer n'importe quelle application pour ne jamais économiser la batterie, en ignorant le réglage automatique. Dans cet esprit, examinons les solutions possibles.

Il existe un scénario dans lequel vous n'avez pas à vous soucier de l'application et de l'optimisation de l'application: lorsque l'optimisation de l'application est entièrement désactivée.

En regardant de côté, vous ne pouvez faire que deux choses:

  1. Demandez aux utilisateurs de Samsung de désactiver l'optimisation de la batterie de votre application pour éviter les problèmes

  2. Comme @MinaSamy l'a suggéré (dans leur réponse maintenant supprimée), SyncAdapter et ayant une synchronisation périodique. Notez que je n'ai pas testé cela, donc je ne sais pas si cela fonctionne ou non.

Et il y a aussi une troisième option, qui n'est vraiment pas une solution, mais vous pouvez l'ignorer et jouer pour que l'optimisation des applications soit désactivée, ou tout simplement ne pas vous en soucier.

Quelqu'un a-t-il un aperçu de ce que Samsung considère comme "utilisé" et puis-je le déclencher?

Autant que je sache, à moins que Samsung n’ajoute des garde-fous contre une ouverture accidentelle ou n’ait ajouté une sorte d’exigence d’activité minimale, l’ouverture est suffisante. Cela semble être une fonctionnalité "stupide", qui fonctionne sur des règles codées en dur plutôt que sur un système dynamique qui détecte réellement l'utilisation d'applications et définit une économie d'énergie relative à celle-ci. C'est "facile à activer", mais heureusement facile à désactiver aussi. 

Cela signifie que vous ne pouvez pas déclencher un événement qui le maintiendra en vie (sauf si SyncAdapter fait l'affaire)

Et pour clarifier les faits, de @ réponse de Neil :

Il semble que l'utilisateur puisse le faire. Il doit donc exister une base de données ou un paramètre quelque part pour la contrôler.

Il y a un peu. Il existe un total de quatre paramètres, dont trois sont spécifiques à une application, et il est stocké dans une base de données (ou une autre forme de stockage de données). Ces quatre paramètres peuvent être utilisés, bien que extrêmement superficiels, pour modifier le comportement de l'optimisation de l'application:

  • Toujours optimiser 
  • Optimisation automatique
  • Ne jamais optimiser 
  • Désactiver l'optimisation de l'application 

Les trois premières options concernent chaque application, ce qui signifie que chaque application peut avoir des paramètres distincts. Désactiver l'optimisation des applications correspond exactement à ce que vous attendez: il désactive l'intégralité de la fonctionnalité pour toutes les applications. S'il est entièrement désactivé, rien n'est optimisé. 

7
Zoe

Y a-t-il une raison pour laquelle vous ne pouvez pas ajouter votre service à la liste "Ne pas optimiser"? 

Il semble que l'utilisateur puisse le faire. Il doit donc exister une base de données ou un paramètre quelque part pour la contrôler. 

Si vous détectez que vous installez sur l’un des périphériques, ouvrez la page d’optimisation de l’activité et affichez un message indiquant «Ne nous optimisez pas!».

1
Neil

En guise de solution de contournement, j’ai mis en œuvre le mécanisme SyncAdapter, en utilisant ce lien comme bon point de départ: https://github.com/bmeike/MiniSync Il ne fonctionne pas parfaitement (pour les mon application, j’écris un journal toutes les heures et au bout de 3 jours, elle commence à ne pas respecter cette planification, mais au moins elle ne s’arrête pas au bout de 3 jours, sans avoir à mettre l’application en mode d’optimisation ignorée.

0
izio

À mon avis, vous devez implémenter un 'Récepteur de diffusion' qui écoute une 'Intention' personnalisée et cette 'Intention' à diffuser par le 'Service' à partir de la méthode 'onDestroy ()' du 'Service' car quand le 'Système' tuer le 'Service' cette méthode sera appelée définitivement. Et lorsque le 'Récepteur de diffusion' recevra le 'Intention', vous devrez recommencer le 'Service'. Et pour faire la distinction entre arrêter le Le 'service' ou le 'système' qui arrête le 'service' utilise uniquement des 'booléens' stockés dans 'SharedPreferences' puis dans le 'récepteur récepteur' vous décidez d'activer ou non le 'service'

0
Mohammad Haidar