2017-01-14 2 views
1

Es schien immer eine Art schwarze Magie zu sein, wie andere Apps ihre Dienste immer laufen lassen, aber meine wird jedes Mal vom System getötet.Wie man den Android-Dienst immer läuft?

Meine App sollte einen TCP-Socket für den Server geöffnet halten und Daten senden/empfangen, wenn sie verfügbar sind, also muss sie immer eingeschaltet bleiben.

Das ist, was ich bisher versucht habe:

1) in einem anderen Prozess den Dienst ausgeführt diese Zeile verwenden (auch mit einer zusätzlichen Leitung stopWithTask):

android:process="package.name.custom_process_name" 
android:stopWithTask="false" 

2) Neustart den Service, wenn diese Methoden erhalten genannt:

onTaskRemoved() 
onDestroy() 

3) In return START_STICKY zu onStartCommand() Methode

4) Überprüfen Sie, ob der Dienst noch ausgeführt wird, wenn diese Ereignisse eintreten:

android.net.wifi.WIFI_STATE_CHANGED 
android.net.conn.CONNECTIVITY_CHANGE 

- Here I an den Server die Socket-Verbindung am stoppen, wenn das Gerät keine Internetverbindung hat mehr und es Wiedereröffnung, wenn es bekommt eine Verbindung.

Doch mein Dienst wird immer zufällig (manchmal nach ein paar Stunden, manchmal nach ein paar Tagen) vom System beendet und startet nicht automatisch neu, bis ich die App wieder öffne.

Wie halten andere Apps, zum Beispiel Chat-Apps, ihre Dienste ständig verfügbar?

S.S .: Eine dauerhafte Benachrichtigung wäre die geringste Option.

+1

Die meisten von ihnen sind Vordergrund-Dienste ('Service # startForeground') – pskink

+0

Dies bedeutet, eine dauerhafte Benachrichtigung anzuzeigen, aber schauen Sie auf Facebook, WhatsApp, Viber, Pushbullet. Diese haben keine Vordergrundbenachrichtigung und sie laufen immer noch im Hintergrund. – Ibrahim

+0

Warum denkst du, dass sie "die ganze Zeit im Hintergrund laufen"? – pskink

Antwort

0

Überschreiben Sie onDestroy() in Ihrem Service, wenn Ihr Dienst zerstört Alarm mit AlarmManager erstellen. Wenn der Alarm ausgelöst wird, starten Sie Ihren Dienst erneut.

Zweiter Weg ist nicht empfohlen oder richtiger Weg, aber erstellen Sie einen separaten Dienst AlwaysAliveService, die nichts tun wird, aber im Android-System verfügbar bleiben wird.

+0

Können Sie Ihren Dienst nicht gerade neu starten, wenn onDestroy aufgerufen wird? Was nützt der 'AlwaysAliveService' wenn er nichts bringt? – salvolds

+0

Ich habe meinen Dienst bereits neu gestartet, als 'onDestroy()' passiert ist, habe aber nicht versucht, den AlarmManager zu verwenden. Ich werde es versuchen und sehen, was passiert. – Ibrahim

+1

Installieren Sie ES File Explorer, und überprüfen Sie, ob sie KeepAliveService verwenden. Zweitens, wenn das System einige Ressourcen benötigt, tötet das System Ihren Service. Es ist also kein guter Ansatz, den Dienst erneut zu starten. Nehmen Sie sich etwas Zeit und starten Sie ihn erneut. Was kann getan werden mit Alarm –