2015-05-29 10 views
10

ich sogar ein IntentService im Hintergrund laufen halten will, wenn die App getötet wird. Und mit „getötet“ Ich meine Presse Home-Taste für eine lange Zeit ->sehen Sie alle laufenden Anwendungen ->swipe meine app beiseite ->App getötet OR drücken Back-Taste für eine lange Zeit ->App getötetAndroid: Dienst am Laufen halten, wenn app getötet

Mein Code geht wie folgt. In meinem MainActivity:

Intent intent = new Intent(this, MyService.class); 
this.startService(intent); 

In meinem MyService:

public class MyService extends IntentService { 

@Override 
protected void onHandleIntent(Intent intent) { 
    System.out.println("MyService started"); 
    run(); 
} 

private void run() { 
    while (true){ 
     System.out.println("MyService still running"); 
     doSomething(); 
     waitSomeTime(); 
    } 
} 

} 

Ich sehe, dass der Dienst ausgeführt wird, wenn die App offen ist. Es läuft immer noch, wenn ich die App per Home-Button minimieren. Es läuft immer noch wenn ich die App über die Zurück-Taste schließe. Aber es wird aufhören, wenn ich es wie oben erwähnt töte. Wie löse ich das?

+0

können Sie dies beziehen. http://androidtrainningcenter.blogspot.in/2013/05/how-to-make-android-service-unstoppable.html –

+0

Ich habe es versucht (heruntergeladen das Beispiel): Ja, der Dienst überlebt einen Kill über Task-Manager, aber es Überlebt den "Zurückdrücken-Button für lange Zeit" nicht. Hast du eine Idee? – user2078872

Antwort

3

innen onstart Befehl START_STICKY setzen ... Dieser Dienst wird nicht töten, es sei denn es wird zu viel Aufgabe und Kernel tun will, es für sie töten ...

@Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      Log.i("LocalService", "Received start id " + startId + ": " + intent); 
      // We want this service to continue running until it is explicitly 
      // stopped, so return sticky. 
      return START_STICKY; 
     } 
+0

funktioniert für den Kill über Task-Manager, aber der Dienst überlebt nicht eine "Zurück-Taste für eine lange Zeit" kill:/ – user2078872

+0

kann sein, wenn START_STICKY nicht funktioniert, wird nichts funktionieren ... – kiturk3

3

Der Grund dafür, dass Sie ist versuchen einen IntentService zu verwenden. Hier ist die Linie von der API Docs

Die IntentService macht folgendes:

Stoppt den Dienst schließlich beginnen Anfragen behandelt wurden, so dass man nie stopSelf zu nennen haben().

Wenn Sie möchten, dass Ihr Dienst auf unbestimmte Zeit läuft, sollten Sie stattdessen die Dienstklasse erweitern. Dies garantiert jedoch nicht, dass Ihr Dienst auf unbestimmte Zeit läuft. Ihr Dienst wird immer noch eine Chance, durch den Kern in einem Zustand niedriger Speicher getötet zu werden, wenn es niedrig priority.So ist Sie haben zwei Möglichkeiten:
1) Halten Sie es durch Aufrufen der startForeground() Methode im Vordergrund läuft.
2) Starten Sie den Dienst neu, wenn er beendet wird. Hier ist ein Teil des Beispiels aus der Dokumentation, wo sie über einen Neustart den Service sprechen, nachdem sie von Ihrem App

public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); 

     // For each start request, send a message to start a job and deliver the 
     // start ID so we know which request we're stopping when we finish the job 
     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     mServiceHandler.sendMessage(msg); 

     // If we get killed, after returning from here, restart 
     return START_STICKY; 
    } 
11

Wenn Ihr Dienst gestartet wird, dann tatsächlich Ihr Dienst läuft auf dem Haupt Prozess abgebrochen wird. Wenn die App beendet wird, wird der Dienst ebenfalls beendet. Also, was Sie tun können, ist, senden Broadcast von onTaskRemoved Methode Ihres Service wie folgt:

Intent intent = new Intent("com.android.ServiceStopped"); 
sendBroadcast(intent); 

und haben einen Rundfunkempfänger, die wieder einen Dienst starten. Ich habe es versucht. Service startet von allen Arten von Kills neu.

+6

das ist die richtige Antwort . Ich habe ein einfaches Beispiel in einem [Blog-Eintrag] geschrieben (http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android) – FabioC

+0

PLZ sagen Sie mir, was ich schreibe Absicht bedeutet "com.android.ServiceStopped" was es bedeutet, welche Absicht ich in sendBroadcast-Methode aufgerufen habe, ist eine neue Absicht zu schaffen, den Dienst zu stoppen –

+0

@AhmadJoyia können Sie plz Ihre Frage klären. Ich bin mir nicht sicher, wo genau das Problem ist. – BhendiGawaar

2

Sie können android:stopWithTask="false" in Manifest wie unten verwenden, Dies bedeutet, auch wenn Benutzer App durch Entfernen von Tasklist, tötet, wird Ihr Dienst nicht aufhören.

<service android:name=".service.StickyService" 
        android:stopWithTask="false"/> 
+0

Es ist standardmäßig falsch !! –

Verwandte Themen