2013-07-25 3 views
7

Ich habe einen Dienst, der für längere Zeit im Hintergrund ausgeführt werden muss. Ein Vordergrunddienst ist aufgrund der Benachrichtigung nicht geeignet. Es muss leise im Hintergrund laufen, wenn es umgeht. Es tut dies bereits und verhält sich wie es sollte. Das ist nicht mein Problem, das ist nur ein Hintergrund.Wie kann ich einen Android-Dienst, der vom Betriebssystem getötet wird, ordnungsgemäß verwalten?

Wenn der Service vom Benutzer getötet wird und onDestroy() aufgerufen wird, werden die Daten in der Datenbank gespeichert - kein Problem. Auch wenn das Telefon ausgeschaltet ist, habe ich einen Sendeempfänger, der auf Bildschirm ab/an hört. Wieder kein Problem dort zu speichern.

Das Problem ist, wenn das Betriebssystem den Dienst wegen zu wenig Arbeitsspeicher beendet. Der Dienst wird beendet und ich glaube nicht, dass onDestroy() aufgerufen wird. Wenn dies der Fall ist, werden meine Daten nicht gespeichert. Wenn also der Dienst getötet wird und seit einiger Zeit läuft, sind alle gesammelten Informationen verloren.

Nach all dem ist meine Frage: Wie sollte ich meine Ressourcen aufräumen und meine Daten speichern? Gibt es eine Möglichkeit, Code auszuführen, um meine Daten zu speichern, bevor das System meinen Dienst beendet? Ich habe erwogen, meinen Dienst in Abständen von einigen Minuten in der Datenbank zu speichern, um den Datenverlust zu reduzieren. Ich bin mir nicht sicher, wie gut das leistungsmäßig ist. Die Abfragen würden wahrscheinlich nur 30 Zeilen in einem Zeitraum von etwa 5 Minuten einfügen. Wahrscheinlich weniger.

Ich bin eine relativ neue Android-Entwicklung und habe mein Bestes versucht, um dieses Problem zu sehen, bevor Sie hierher kommen, um eine Frage zu stellen. Entschuldigung, wenn ich etwas übersehen habe.

Danke!

+0

onDestroy sollte aufgerufen werden und Sie können dort Ihre Daten persistieren. Laden Sie es agaib, wenn der Dienst neu gestartet wird. –

+0

onDestroy() wird nicht aufgerufen, wenn das System den Dienst aufgrund niedriger Ressourcen beendet. @BLAZURE - Die Dokumentation, die Sie verlinkt haben, ist für eine Aktivität. Korrigiere mich, wenn ich falsch liege, aber ein Service keine onPause() -Methode hat? –

Antwort

3

Wenn Ihr Dienst von os beendet wird, könnte bei diesem Ereignis kein Code ausgeführt werden. Sie müssen daher Ihre Daten speichern, nachdem sie geändert wurden.

In der Tat wird ein Hintergrunddienst neu gestartet, wenn Service.START_STICKY_COMPATIBILITY in onStartCommand() zurückgegeben wird. Dies ist die Standardauswahl und Sie müssen sich keine Gedanken darüber machen. Nehmen Sie einfach eine schnelle Initialisierung in Ihrem Service vor und speichern Sie Ihr Ergebnis so schnell wie möglich.

+0

Würden Sie vorschlagen, meine Daten in einem Intervall zu speichern? Sag 2 Minuten oder so? –

+0

Wenn Sie die Datenänderung nicht überwachen können, speichern Sie Daten nur in regelmäßigen Abständen. – faylon

+0

Ich kann Datenänderungen speichern. Ich war mir nur nicht sicher, ob dies als schlechte Praxis angesehen wurde, so oft auf die Datenbank zuzugreifen. Aber danke, ich werde deine Antwort akzeptieren. –

Verwandte Themen