Gibt es eine Möglichkeit, eine App zu zwingen, im Hintergrund weiter ausgeführt zu werden, egal was passiert?

Auf Ice Cream Sandwich (ICS) kategorisiert das Betriebssystem Ihre App, und jede Kategorie hat ihren eigenen Schwellenwert, den das Betriebssystem verwendet, um zu bestimmen, welche App zuerst geschlossen wird, wenn ihr der Arbeitsspeicher ausgeht.

Hat sich jemand von Ihnen darüber geärgert, sagen wir, Sie haben einen Timer geöffnet, der im Hintergrund läuft, um die verstrichene Zeit von etwas zu messen, dann haben Sie ein paar 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 entsetzlich nervig.

Gibt es eine Möglichkeit, eine App zu zwingen, im Hintergrund weiter ausgeführt zu werden, auch wenn dem Betriebssystem der Speicher ausgeht?

Das ist ein Zeichen für einen schlechten Code der App. Ein Benutzer sollte sich nie darum kümmern müssen und Android bietet Mittel, damit eine App ihren Zustand speichern und später wiederherstellen kann (seit den frühen Android-Versionen). Sie sollten einen Fehlerbericht an den App-Entwickler senden.

Antworten (5)

Die akzeptierte Antwort stellte sich als falsch oder veraltet heraus. Mit dem Modul „App-Einstellungen“ für die Xposed-App können Sie auf App-Basis festlegen, dass Apps nicht gelöscht oder freigegeben werden:

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

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

Beim Spielen mit Apps, die ein solches Low-Level-Verhalten ändern, sollte natürlich verantwortungsbewusst vorgegangen werden.

Man sollte beachten, dass dies Root erfordert und die Installation einer schweren Modifikation des Android-Betriebssystems ist.

Einfache Antwort: Nein. Android verwendet immer OOM (Out-Of-Memory), um ungenutzten Speicher 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.

Stellen Sie sich dieses Szenario vor: Sie haben eine schlecht codierte App heruntergeladen, die beim Booten ausgeführt wird, einen Pufferüberlauf verursacht und Ihren gesamten Speicher belegt. Normalerweise wird diese App beendet, aber wenn sie so eingestellt ist, dass sie geöffnet bleibt, blockiert sie Ihr Telefon effektiv bis zum Neustart und startet danach wieder und wieder usw.

Einige Timer verwenden Dienste mit hohen Prioritäten, um dieses Problem zu vermeiden, aber wenn Sie genügend leistungsstarke, ressourcenraubende Apps starten, während der Timer im Hintergrund läuft, wird er schließlich beendet.

Sieht so aus, als wäre es das. Ich frage mich, ob es eine Ausnahme von dieser Regel gibt, wissen Sie, System-Apps wie Telefon, Kontakte, Alarme usw. Ich hoffe, Google wird Benutzern in Zukunft eine Option bieten, um alle Apps zu "pinnen", die der Benutzer manuell gestartet hat. Es muss nicht beim Start durchgeführt werden, um zu verhindern, dass das Telefon gemauert wird. Oder vielleicht könnten sie das System zumindest für eine Weile versuchen lassen, es zu fixieren, und wenn das System nicht mehr reagiert, den Benutzer schließen lassen.
Sollte dies jemals passieren, würde ich zumindest eine neue Berechtigungskategorie für solche Apps erwarten. Dies würde Menschen, die Wert auf ihre Akkulaufzeit und Systemstabilität legen, helfen, diese Apps zu vermeiden. Ich würde.
Das muss nicht sein, IMO. Lassen Sie das System standardmäßig seine alten Wege gehen, und falls der Benutzer beabsichtigt, eine bestimmte App nur in diesem bestimmten Moment im Hintergrund auszuführen, wenn dies erforderlich ist, bieten Sie einfach 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 unstoppbar ist, sobald sie ausgeführt wird. Ich möchte nur eine Option, um dies zu tun, wenn es notwendig ist, genau wie das, was ich in meiner Frage beschrieben habe.
@onik ein Pufferüberlauf hat nichts mit Speicherbelegung zu tun. Wissen Sie, was ein Pufferüberlauf ist?
@dcow Ja, ich bin mit Pufferüberläufen vertraut. Da Android seinen Sandboxen über eine dynamische Speicherzuweisung verfügt, kann ein Pufferüberlauf die aktuellen Speichergrenzen überschreiten und dazu führen, dass die Sandbox wächst. Natürlich war dies aufgrund der Speicherverwaltung von Java vielleicht ein Nischenbeispiel, besser wäre eine Endlosschleife in einer LinkedList, die nicht Integer.MAX_VALUEdurch ihre Struktur eingeschränkt ist und dynamisch erweitert werden kann.
@onik, also lautet die Antwort nein, Sie wissen nicht, was ein Pufferüberlauf ist. Habe es.
@onik hier ist übrigens ein Link: en.wikipedia.org/wiki/Buffer_overflow
@onik Auch eine Endlosschleife in einer verknüpften Liste könnte Sie sicherlich in ein OOM führen, lange bevor Sie eine Schleife durchlaufen haben Integer.MAX_VALUE. Warum denkst du, dass die Dinge durch Integer.MAX_VALUEsowieso begrenzt sind?
@dcow, sagen Sie also, dass ein Pufferüberlauf die dynamisch zugewiesene Speichergröße nicht erweitern kann oder dass es nicht die übliche Präsentation ist? Und die Grenze kam von der internen Struktur von Arrays und Vektoren, an die ich in diesem Fall zufällig zuerst dachte. Oh, und danke für den Link, von Wikipedia hatte ich noch nie gehört! ;)
@onik richtig: Per Definition kann ein Pufferüberlauf die zugewiesene Speichergröße nicht erweitern. Wenn es die zugewiesene Speichergröße erweitert, ist es kein Pufferüberlauf. Du denkst an eine Endlosschleife, denke ich.

Nein. Allerdings fallen mir zwei Methoden ein, um das Problem zu lindern, aber beide können nur vom Entwickler implementiert werden: Die erste besteht darin, eine Benachrichtigung anzuzeigen, Android gibt Apps, die dies tun, eine höhere Priorität als andere. Die zweite besteht darin, die Startzeit zu speichern, damit der Timer, wenn er schließlich neu gestartet wird, nicht zurückgesetzt wird.

Das Ausführen von Apps ohne Grund mit Vordergrundpriorität (dafür wird die Benachrichtigung benötigt) gilt als schlechte Praxis. Wie schon gesagt: Android bietet eine nette Api, die sogar Timer/Zähler zulässt, die nicht vom OOM-Killer betroffen sind. Zu diesem Thema gibt es einen schönen Beitrag von Dianne Hackborn
Ich bezweifle nicht, dass es eine solche API gibt, aber wo in dieser Frage wurde dies schon einmal erwähnt?
Außerdem gibt es offensichtlich einen Grund, die App in diesem Fall im Gegensatz zu dem von Ihnen geposteten Spielbeispiel nach Möglichkeit am Laufen zu halten.
Nein, es gibt keinen Grund, eine App nur wegen eines Timers am Laufen zu halten. Verwenden Sie einfach onSaveInstanceStateund onRestoreInstanceState, um den App-Status einschließlich der Timer-Informationen zu speichern. Keine Notwendigkeit, im Vordergrund zu laufen. Selbst wenn es sich um einen Alarm handelt, können Sie AlarmManagersicherstellen, dass er später ausgeführt wird. Der einzige Grund, aus dem Foreground verwendet werden sollte, ist: 1. Sie haben eine tatsächliche Aktivität im Vordergrund, wie das Abspielen von Musik oder das Zeigen eines Videos. 2. Sie wollen eine Datenverbindung offen halten (zB IMAP IDLE (push)).

1. Methode: -- Wenn Sie Sticky Thread im Programm erstellen, können Sie Ihr Programm zwangsweise am Laufen halten. Denken Sie jedoch daran, dass der Benutzer im erweiterten Einstellungsmodus im Hintergrund laufende Apps stoppen kann. Wenn Sie den Sticky-Thread jedoch so schreiben, dass er bei einem bestimmten Ereignis beginnt, kann dies erreicht werden.

2. Methode: WENN der Benutzer kein gerootetes Android ist und eine App im Hintergrund ausführen möchte. Verwenden Sie das SL4-Skript im Hintergrund der App. Verwenden Sie ein Skript, das Hintergrundprüfungen und Programme durchführt, und schreiben Sie das Frontend, um etwas anderes anzuzeigen.

ZB: In den meisten Spiele-Engines ist dies eingebaut. Sie verbinden sich mit Servern, obwohl der Benutzer die App deaktiviert hat. Der Grund, warum die Engine mehrere Skripte im Telefon erstellt, die bei bestimmten Ereignissen zufällig überprüft werden, und dass TRIGGER verwendet wird, um Ihre App kontinuierlich im Hintergrund des Vordergrunds auszuführen.

***Entschuldigung für die TYPO's .. Rechtschreibprüfung nicht verfügbar. Hoffe, du erreichst, was du erreichen wolltest.

Willkommen bei Android Enthusiast, einer Q&A-Website für Android-Endbenutzer. Soweit ich verstehen kann, können die beiden von Ihnen bereitgestellten Methoden nur von der Entwicklerseite aus durchgeführt werden, dh von denen, die über den Quellcode der App verfügen. Leider ist dies für die meisten Leser hier möglicherweise nicht hilfreich, da sie keine App entwickeln. Wenn dies für Nicht-Entwickler zutrifft , sollten Sie die Antwort bearbeiten , um deutlich zu machen, wie Sie dies tun können, ohne den Quellcode der App zu berühren . Danke.

Manchmal gibt es eine Option zum Sperren der App. Dies verhindert das Beenden oder Stoppen dieser Anwendung im Telefon.

Die Sperroption ist im Betriebssystem selbst nicht verfügbar, die Verwendung einiger Apps von Drittanbietern wie GO Task Manager usw. kann hilfreich sein.

Das Töten von OOM wird vom Kernel durchgeführt und keine App kann dies verhindern oder einen Prozess "sperren". Die App, mit der Sie verlinkt haben, ist ein Task-Killer, der Apps selbst beendet. Die Sperrfunktion, auf die Sie sich beziehen, verhindert nur das Töten durch den Task-Killer.