UPDATE: Zuvor konnte ich kein genau definiertes Muster finden, wenn mein Vordergrund-Dienst getötet wurde. Nach mehr Debugging mit den Geräten (passiert nicht bei allen) auf dem dies geschah fand ich.
1.) Wenn ich Chrome öffne, um eine Webseite zu laden, wird der Vordergrund-Dienst oft gelöscht. Manchmal passiert das sogar, wenn ich whatsapp verwende.
2.) Es gibt keine Ausnahmen und der Stacktrace zeigt nichts Nützliches.
Ursprüngliche Frage unten:
Es gibt viele solche Fragen zu StackOverflow, aber die Antworten, die ich bisher gelesen habe, sagen meistens, dass es bis Android läuft und wir haben keine 100% Garantie, dass ein Vordergrund-Service nicht getötet wird. Einige Antworten schlagen START_STICKY vor, aber das ist in meinem Fall nicht sehr hilfreich.
In meinem Fall habe ich eine Musik-Player-App, die einen Vordergrund-Service hat. Dieser Dienst wird auf bestimmten Geräten, meist einigen Versionen von Xiomi (Android Version 5.1.1), beendet. Jetzt verstehe ich, dass Android wenig Speicher hat und so wird mein Vordergrund-Service getötet, aber dann warum andere Musik-Player-Apps nie durch solch eine Beendigung gehen. Was machen sie richtig, dass ich nicht bin?
Ich habe meinen Service-Vordergrunddienst mithilfe von startForeground
eingerichtet. Ich gebe auch START_STICKY
in onStartCommand zurück, obwohl das nicht hilft, da der Dienst nach einer Pause von 4-5 Sekunden neu gestartet wird, wenn er beendet wird. Um meinen Service mit meiner Aktivität zu verbinden, verwende ich
Was genau kann ich in meiner App verbessern / ändern, um dies zu verhindern? Wenn andere Apps genau dort funktionieren, muss in meinem Fall etwas nicht stimmen. Kann mir bitte jemand helfen. Vielen Dank im Voraus!
Bearbeiten:
So rufe ich startForeground () auf
%Vor%Dies geschah in Xiomi Telefon aus unter Grund.
Lösung für MIUI 7.0 = & gt; Sicherheit = & gt; Autostart = & gt; wähle Apps, die im Hintergrund ausgeführt werden sollen = & gt; Neustart Nach dem Neustart sollte Ihr Gerät Ihre Anwendungsdienste im Hintergrund ausführen können, wie dies bei anderen Android-Geräten der Fall ist.
MIUI AutoStart Detaillierte Beschreibung
Und wenn Sie nach anderen Telefon suchen, dann überprüfen Sie hier ist Service-Struktur. Es startet automatisch neu, aber wenn Sie Telefonanruf BootReceiver neu starten.
%Vor%Danke, das wird dir helfen.
Dieser Dienst wird auf bestimmten Geräten, meist einigen Versionen von, beendet Xiomi (Android-Version war 5.1.1)
Ich bin mir nicht sicher, aber nach meinem Verständnis könnte das an
liegen Ich weiß nicht, ob Sie startService ()
Sie können einen Dienst erstellen, der sowohl gestartet als auch gebunden ist. Das heißt, die Der Dienst kann gestartet werden, indem
startService()
aufgerufen wird Der Dienst wird unbegrenzt ausgeführt und ermöglicht auch die Bindung eines Clients an Service durch Aufruf von bindService ( ) . (Dies wird Bindung an einen gestarteten Dienst genannt)Wenn Sie zulassen, dass Ihr Dienst gestartet und gebunden wird, dann wenn der Dienst wurde gestartet, das System zerstört den Dienst nicht wann Alle Clients werden gelöst. Stattdessen müssen Sie den Dienst explizit beenden, indem Sie Aufruf von
stopSelf()
oderstopService()
.Obwohl Sie normalerweise entweder onBind () oder onStartCommand () , ist es manchmal notwendig, beides zu implementieren. Zum Beispielsweise könnte es ein Musik-Player nützlich finden, seinen Dienst zu ermöglichen unbegrenzt laufen und auch verbindlich machen. Auf diese Weise kann eine Aktivität Starten Sie den Dienst, um etwas Musik zu spielen, und die Musik spielt weiter auch wenn der Benutzer die Anwendung verlässt. Dann, wenn der Benutzer zurückkehrt zu der Anwendung kann die Aktivität an den Dienst binden, um wiederzugewinnen Kontrolle der Wiedergabe.
Lesen Sie unbedingt den Abschnitt den Lebenszyklus eines gebundenen Dienstes verwalten , Weitere Informationen zum Dienstlebenszyklus beim Hinzufügen der -Bindung zu einem gestarteten Dienst .
onStartCommand
wird im Fall des gestarteten Dienstes aufgerufen, so dass START_STICKY
nur im Fall von startService()
funktioniert.
Aktualisierung der Prozessprotokolle
Proc # 5: prcp F / S / ZF trm: 0 22407: com.wave.music.player / u0a2 (fg-service)
Melden Sie in Ihrem Prozess Ihren Player-Dienst im Vordergrund mit der adj-Einstellung prcp (visible foreground service)
an, was bedeutet, dass er praktisch unzerstörbar ist. Trotzdem wird Ihr Dienst vom Betriebssystem zerstört, da möglicherweise nur sehr wenig Speicher verfügbar ist, um die neu gestartete App auszuführen. Gemäß diesem Dokumentation ,
Im System gibt es immer nur einige Vordergrundprozesse, und diese wird nur als letzter Ausweg getötet werden, wenn die Erinnerung so niedrig ist, dass nicht einmal Diese Prozesse können weiterhin ausgeführt werden. Im Allgemeinen, an diesem Punkt, der Gerät hat einen Speicher-Paging-Status erreicht, so dass diese Aktion erforderlich ist um die Benutzeroberfläche ansprechend zu halten.
Ich denke also, dass Sie nichts falsch machen. Ich möchte nur vorschlagen, dass Sie diese offizielle Android-Entwicklerdokumentation lesen und versuchen, Ihren Dienst auszuführen separater Prozess (Dokumentation schlägt diesen Ansatz für die Musik-Player-App vor). Achten Sie darauf, dies zu implementieren, da es Ihren RAM-Footprint leicht erhöhen (anstatt ihn verringern) kann, wenn er falsch ausgeführt wird.
Tags und Links android android-service