Gibt es eine Möglichkeit, die Ausführung einer App im Hintergrund zu erzwingen, egal was passiert?

12

Auf Ice Cream Sandwich (ICS) kategorisiert das Betriebssystem Ihre App und jede Kategorie hat einen eigenen Schwellenwert, anhand dessen das Betriebssystem bestimmt, welche App zuerst geschlossen wird, wenn der Arbeitsspeicher knapp wird.

Hat sich jemand von Ihnen geärgert, dass Sie einen Timer geöffnet haben, der im Hintergrund ausgeführt wird, um die abgelaufene Zeit zu messen? Dann haben Sie einige weitere Apps geöffnet und sind zu Ihrem Timer zurückgekehrt, nur um zu sehen, dass er zurückgesetzt oder geschlossen wurde? Ich meine, im Ernst, es ist wirklich unerträglich nervig.

Gibt es eine Möglichkeit, die Ausführung einer App im Hintergrund zu erzwingen, auch wenn auf dem Betriebssystem kein Speicher mehr verfügbar ist?

supertonsky
quelle
7
Das ist ein Zeichen für einen schlechten Code von der App. Ein Benutzer sollte sich niemals damit herumärgern müssen und Android stellt Mittel zur Verfügung, mit denen eine App ihren Status speichern und später wiederherstellen kann (seit den frühen Android-Versionen). Sie sollten einen Fehlerbericht an den App-Entwickler senden.
Flow

Antworten:

8

Die akzeptierte Antwort stellte sich als falsch oder veraltet heraus. Mit dem Modul "App-Einstellungen" für die Xposed-App können Sie pro App festlegen, dass Apps nicht getötet oder freigegeben werden:

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

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

Selbstverständlich sollte beim Spielen mit Apps, die ein derart niedriges Verhalten aufweisen, mit größter Sorgfalt vorgegangen werden.

Drehmoment
quelle
Man sollte beachten, dass dies root erfordert und die Installation einer starken Android OS Modifikation ist.
sweisgerber.dev
5

Einfache Antwort: Nein. Android verwendet immer OOM (Out-Of-Memory), um nicht genutzten Speicherplatz freizugeben. Sie können die Prioritäten von Apps (zumindest bis zum Neustart) mit einigen Task-Managern ändern, aber selbst dann, wenn der Speicher knapp wird, werden Apps im Hintergrund beendet.

Denken Sie an dieses Szenario: Sie haben eine schlecht codierte App heruntergeladen, die beim Booten ausgeführt wird, einen Pufferüberlauf verursacht und Ihren gesamten Arbeitsspeicher beansprucht. Normalerweise wird diese App beendet, aber wenn sie so eingestellt ist, dass sie offen bleibt, wird Ihr Telefon bis zum Neustart blockiert und danach erneut gestartet usw.

Einige Zeitgeber verwenden Dienste mit hohen Prioritäten, um dieses Problem zu vermeiden. Wenn Sie jedoch genügend leistungsfähige, ressourcenschonende Apps starten, während sich der Zeitgeber im Hintergrund befindet, wird er möglicherweise beendet.

onik
quelle
1
Das muss nicht so sein, IMO. Lassen Sie das System standardmäßig seine alten Methoden anwenden. Wenn der Benutzer beabsichtigt, dass eine bestimmte App zu einem bestimmten Zeitpunkt im Hintergrund ausgeführt wird, wenn dies erforderlich ist, geben Sie diese Option an. Es muss keine andere Berechtigungskategorie vorhanden sein, da es im Ermessen der Benutzer liegt, eine App zu "pinnen". Ich möchte nicht, dass eine App dauerhaft nicht mehr zu stoppen ist, sobald sie ausgeführt wird. Ich möchte nur eine Option, um dies zu tun, wenn es einen Bedarf gibt, wie ich ihn in meiner Frage beschrieben habe.
Supertonsky
1
@onik Ein Pufferüberlauf hat nichts mit dem Speichern zu tun. Wissen Sie, was ein Pufferüberlauf ist?
3
@onik also die Antwort ist nein, du weißt nicht was ein Pufferüberlauf ist. Ich habs.
1
@onik auch eine Endlosschleife in einer verknüpften Liste könnte Sie sicherlich in eine OOM führen, lange bevor Sie die Integer.MAX_VALUEZeiten wiederholt haben . Warum denkst du, sind die Dinge Integer.MAX_VALUEsowieso begrenzt?
1
@onik richtig: Per Definition kann ein Pufferüberlauf die zugewiesene Speichergröße nicht erweitern. Wenn es die zugewiesene Speichergröße erweitert, handelt es sich nicht um einen Pufferüberlauf. Du denkst an eine Endlosschleife, denke ich.
Mooing Duck
1

Es gibt jedoch zwei Methoden, um das Problem zu lösen, die jedoch nur vom Entwickler implementiert werden können: Die erste besteht darin, eine Benachrichtigung anzuzeigen. Android gibt Apps, die dies tun, eine höhere Priorität als andere. Die zweite ist, die Startzeit zu speichern, damit sie nicht zurückgesetzt wird, wenn der Timer irgendwann neu gestartet wird.

Erik
quelle
1
Das Ausführen von Apps ohne Grund mit Vordergrundpriorität (daher wird die Benachrichtigung benötigt) wird als schlechte Praxis angesehen. Wie gesagt: Android bietet eine nette API, die sogar Timer / Counter erlaubt, die vom OOM-Killer nicht betroffen sind. Es gibt einen schönen Beitrag von Dianne Hackborn zu diesem Thema
Flow
Ich bezweifle nicht, dass es eine solche API gibt, aber wo in dieser Frage wurde dies zuvor erwähnt?
Erik
1
Außerdem gibt es in diesem Fall natürlich einen Grund, die App am Laufen zu halten, wenn dies überhaupt möglich ist, im Gegensatz zu dem von Ihnen veröffentlichten Spielbeispiel.
Erik
4
Nein, es gibt keinen Grund, eine App nur aufgrund eines Timers am Laufen zu halten. Verwenden Sie einfach onSaveInstanceStateund, onRestoreInstanceStateum den App-Status einschließlich der Timer-Informationen zu speichern. Im Vordergrund muss nicht ausgeführt werden. Auch wenn es sich um einen Alarm handelt, können Sie AlarmManagersicherstellen, dass er später ausgeführt wird. Der einzige Grund, warum der Vordergrund verwendet werden sollte, ist: 1. Sie haben eine bestimmte Vordergrundaktivität, z. B. das Abspielen von Musik oder das Anzeigen eines Videos. 2. Sie möchten eine Datenverbindung offen halten (z. B. IMAP IDLE (Push)).
Flow
0

1. Methode: - Wenn Sie im Programm Sticky Thread erstellen, können Sie Ihr Programm zwangsweise auf dem Laufenden halten. Denken Sie jedoch daran, dass der Benutzer im erweiterten Einstellungsmodus Apps beenden kann, die im Hintergrund ausgeführt werden. Wenn Sie jedoch den klebrigen Thread so schreiben, dass er bei jedem aufgetretenen Ereignis beginnt, kann dies erreicht werden.

2. Methode: WENN der Benutzer kein Root-Android ist und eine App im Hintergrund ausführen möchte. benutze SL4 Skript im Hintergrund aus der App. Verwenden Sie ein Skript, mit dem Sie Hintergrundüberprüfungen und Programme durchführen und das Front-End schreiben, um etwas anderes anzuzeigen.

ZB: In den meisten Game Engines ist dies eingebaut. Sie stellen eine Verbindung zu Servern her, obwohl der Benutzer die App deaktiviert hat. Der Grund, warum die Engine im Telefon mehrere Skripte erstellt, die bei bestimmten Ereignissen zufällig überprüft werden und mit TRIGGER Ihre App fortlaufend im Vordergrund ausgeführt wird.

*** Tut mir leid, dass die Rechtschreibprüfung für TYPO nicht verfügbar ist. Hoffe du erreichst, was du erreichen willst.

Becky Mannie
quelle
Willkommen bei Android Enthusiast, einer Q & A-Site für Android-Endbenutzer. Soweit ich weiß, können die beiden Methoden, die Sie angegeben haben, nur vom Entwickler aus durchgeführt werden, dh von denen, die den Quellcode der App haben. Leider könnte dies für die meisten Leser hier nicht hilfreich sein, da sie keine App entwickeln. Wenn dies möglicherweise für Nicht-Entwickler zutrifft , sollten Sie die Antwort bearbeiten , um zu verdeutlichen, wie dies ohne Berührung des Quellcodes der App geschehen soll . Vielen Dank.
Andrew T.
-1

Es gibt manchmal eine Option, um die App zu sperren . Dadurch wird verhindert , dass diese Anwendung im Telefon beendet oder gestoppt wird .

Die Sperroption ist im Betriebssystem selbst nicht verfügbar. Einige Anwendungen von Drittanbietern wie GO Task Manager usw. können hier Abhilfe schaffen.

Jayesh Tiwari
quelle
2
OOM-Killing wird vom Kernel durchgeführt und keine App kann dies verhindern oder einen Prozess "sperren". Die App, mit der Sie verknüpft haben, ist ein Task-Killer, der Apps selbst beendet. Die Sperrfunktion, auf die Sie sich beziehen, verhindert nur, dass der Task-Killer tötet.
Erik