Beim Ausführen von internetbezogenen Vorgängen wird der Vordergrunddienst beendet

9

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

%Vor%

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%     
varunkr 10.09.2016, 16:35
quelle

2 Antworten

3

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 4.0-Einstellungen

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.

    
Saveen 19.09.2016 14:22
quelle
1
  

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
  1. Fehler bei der Anpassung des Betriebssystems vom Hersteller.
  2. Bugs in Android in Bezug auf Priorisierung von Vordergrunddiensten, die durch verschiedene Kombinationen von Dienstbindungsflags ausgelöst werden (z. B. BIND_AUTO_CREATE, BIND_IMPORTANT usw.) .Lesen diese Antwort von Robin Davies.

Ich weiß nicht, ob Sie startService () oder nicht. Aber wenn Sie dies nicht tun, dann Dokumentation :

  

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() oder stopService() .

     

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.

    
Pravin Divraniya 13.09.2016 18:27
quelle

Tags und Links