Existe-t-il un moyen de forcer une application à continuer de fonctionner en arrière-plan, quoi qu'il arrive?

12

Sur Ice Cream Sandwich (ICS), le système d'exploitation catégorise votre application et chaque catégorie a son propre seuil dans lequel le système d'exploitation utilise pour déterminer quelle application fermer en premier lorsqu'il manque de mémoire.

Quelqu'un parmi vous a-t-il été ennuyé, disons que vous avez ouvert une minuterie pour fonctionner en arrière-plan pour mesurer le temps écoulé de quelque chose, puis vous avez ouvert quelques autres applications et êtes revenu à votre minuterie juste pour voir qu'il a été réinitialisé ou fermé? Je veux dire, sérieusement, c'est vraiment très ennuyeux.

Existe-t-il un moyen de forcer une application à continuer de fonctionner en arrière-plan, même si le système d'exploitation manque de mémoire?

supertonsky
la source
7
C'est un signe d'un mauvais code de l'application. Un utilisateur ne devrait jamais avoir à s'en préoccuper et Android fournit des moyens pour qu'une application puisse enregistrer son état et le restaurer plus tard (depuis les premières versions d'Android). Vous devez envoyer un rapport de bogue au développeur de l'application.
Flow

Réponses:

8

La réponse acceptée s'est révélée incorrecte ou obsolète. Le module "Paramètres de l'application" pour l'application Xposed vous permet de spécifier, par application, pour empêcher les applications d'être supprimées ou libérées:

http://repo.xposed.info/module/de.robv.android.xposed.installer

http://repo.xposed.info/module/de.robv.android.xposed.mods.appsettings

Un soin responsable doit bien sûr être exercé lorsque vous jouez avec des applications modifiant un tel comportement de bas niveau.

Couple
la source
Il faut noter que cela nécessite root et est l'installation d'une lourde modification du système d'exploitation Android.
sweisgerber.dev
5

Réponse simple: Non. Android utilise toujours la priorité OOM (Out-Of-Memory) pour libérer la mémoire inutilisée. Vous pouvez modifier les priorités des applications (au moins jusqu'au redémarrage) avec certains gestionnaires de tâches, mais même si la mémoire est faible, les applications en arrière-plan commencent à être tuées.

Pensez à ce scénario: vous avez téléchargé une application mal codée qui s'exécute au démarrage, provoque un débordement de tampon et monopolise toute votre mémoire. Normalement, cette application est tuée, mais si elle est configurée pour rester ouverte, elle brique efficacement votre téléphone jusqu'au redémarrage, puis recommence encore et encore, etc.

Certains temporisateurs utilisent des services avec des priorités élevées pour éviter ce problème, mais si vous lancez suffisamment d'applications hautes performances consommant des ressources alors que le temporisateur est en arrière-plan, il finira par être tué.

onik
la source
1
Cela n'a pas besoin d'être comme ça, OMI. Laissez le système faire ses anciennes méthodes par défaut et au cas où l'utilisateur a l'intention qu'une application particulière s'exécute en arrière-plan juste au moment particulier où le besoin s'en fait sentir, fournissez simplement cette option. Il n'a pas besoin d'avoir une autre catégorie d'autorisation, car il est de la discrétion des utilisateurs de "verrouiller" une application. Je ne veux pas qu'une application soit définitivement imparable une fois lancée. Je veux juste une option pour le faire quand il y a un besoin comme ce que j'ai décrit dans ma question.
supertonsky
1
@onik un débordement de tampon n'a rien à voir avec la mémoire de monopolisation. Savez-vous ce qu'est un débordement de tampon?
3
@onik donc la réponse est non, vous ne savez pas ce qu'est un débordement de tampon. Je l'ai.
1
@onik également une boucle infinie dans une liste chaînée pourrait certainement vous lancer dans un MOO bien avant que vous ayez bouclé des Integer.MAX_VALUEtemps. Pourquoi pensez-vous que les choses sont limitées de Integer.MAX_VALUEtoute façon?
1
@onik correct: par définition, un débordement de tampon ne peut pas augmenter la taille de la mémoire allouée. S'il augmente la taille de la mémoire allouée, ce n'est pas un débordement de tampon. Vous pensez à une boucle infinie, je pense.
Mooing Duck
1

Non. Cependant, deux méthodes pour résoudre le problème viennent à l'esprit, mais les deux ne peuvent être implémentées que par le développeur: la première consiste à afficher une notification, Android accordera aux applications qui le font une priorité plus élevée que les autres. La seconde consiste à enregistrer l'heure de début afin que lorsque la minuterie soit finalement redémarrée, elle ne sera pas réinitialisée.

Erik
la source
1
Exécuter des applications sans raison avec une priorité au premier plan (c'est pourquoi la notification est nécessaire) est considéré comme une mauvaise pratique. Comme dit précédemment: Android fournit une belle API qui autorise même les minuteries / compteurs qui ne sont pas affectés par le tueur OOM. Il y a un joli post de Dianne Hackborn à ce sujet
Flow
Je ne doute pas qu'il existe une telle API, mais où dans cette question cela a-t-il été mentionné auparavant?
Erik
1
De plus, il y a évidemment une raison de faire fonctionner l'application si possible dans ce cas, contrairement à l'exemple de jeu que vous avez publié.
Erik
4
Non, il n'y a aucune raison de faire fonctionner une application uniquement à cause d'une minuterie. Utilisez simplement onSaveInstanceStateet onRestoreInstanceStatepour sécuriser l'état de l'application, y compris les informations de la minuterie. Pas besoin de s'exécuter en premier plan. Même s'il s'agit d'une alarme, vous pouvez vous AlarmManagerassurer qu'elle est exécutée plus tard. La seule raison pour laquelle le premier plan doit être utilisé est: 1. Vous avez une activité réelle au premier plan, comme jouer de la musique ou montrer une vidéo. 2. Vous souhaitez garder une connexion de données ouverte (par exemple IMAP IDLE (push)).
Flow
0

1ère méthode: - Si vous créez Sticky Thread dans le programme, oui, vous pouvez forcer votre programme à courir. Cependant, n'oubliez pas que l'utilisateur en mode de réglage avancé peut arrêter les applications en cours d'exécution en arrière-plan. Cependant, si vous écrivez un fil collant de manière à ce qu'il démarre à tout événement donné, cela peut être réalisé.

2ème méthode: SI l'utilisateur n'est pas rooté et que vous voulez exécuter une application en arrière-plan. utilisez le script SL4 en arrière-plan de l'application. utilisez un script qui vous permettra de vérifier les antécédents et les programmes et d'écrire le front-end pour montrer autre chose.

Par exemple: dans la plupart des moteurs de jeu, c'est intégré. Ils se connectent aux serveurs même si l'utilisateur a désactivé l'application. La raison pour laquelle le moteur crée plusieurs scripts dans le téléphone qui est vérifié de manière aléatoire lors d'événements particuliers et que TRIGGER est utilisé pour exécuter votre application en continu sur l'arrière-plan du premier plan.

*** Désolé pour le TYPO's. Correcteur orthographique non disponible. J'espère que vous atteindrez ce que vous aviez l'intention d'obtenir.

Becky Mannie
la source
Bienvenue sur Android Enthusiast, un site de questions / réponses pour les utilisateurs finaux Android. Pour autant que je puisse comprendre, les 2 méthodes que vous avez fournies ne peuvent être effectuées que du côté développeur, c'est-à-dire celles qui ont le code source de l'application. Malheureusement, cela pourrait ne pas être utile pour la plupart des lecteurs ici, car ils ne développent pas d'application. Si cela peut s'appliquer aux non-développeurs, envisagez de modifier la réponse pour indiquer clairement comment procéder sans toucher au code source de l'application . Merci.
Andrew T.
-1

Il existe parfois une option pour verrouiller l'application. Cela empêche de tuer ou d' arrêter cette application dans le téléphone.

L'option de verrouillage n'est pas disponible dans le système d'exploitation lui-même, l'utilisation de certaines applications tierces comme GO Task Manager , etc., peut vous aider.

Jayesh Tiwari
la source
2
La destruction des MOO est effectuée par le noyau et aucune application ne peut l'empêcher ou "verrouiller" un processus. L'application à laquelle vous êtes lié est un tueur de tâches qui tue les applications elles-mêmes. La fonction de verrouillage à laquelle vous faites référence n'empêchera que le meurtrier de tuer.
Erik