2015-08-01 4 views
7

Ich habe eine App, die als Webserver ausgeführt wird. Die App verfügt über einen Dienst, der START_STICKY ist. Ich möchte, dass dieser Dienst den Webserver ständig ausführt (dem Benutzer wird in einer Benachrichtigung die Option zum Beenden gegeben).Dienst neu gestartet auf Anwendung Schließen - START_STICKY

Problem ist, dass der Server neu gestartet wird (Einstellungen verloren usw.), wenn ich meine App geschlossen habe. Es bleibt dort gut, aber logcat zeigt, dass es neu startet.

Ich kann meine App wieder öffnen und an den neuen Dienst binden, das funktioniert gut. Das erneute Schließen des Swipe hat denselben Effekt.

Ich brauche dies nicht neu zu starten.

Standard-Service-Code

private WebServerService mService; 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
            IBinder binder) { 
     WebServerService.MyBinder b = (WebServerService.MyBinder) binder; 
     mService = b.getService(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mService = null; 
    } 
}; 

public serviceStart() { 
    mIntent = new Intent(mContext.getApplicationContext(), WebServerService.class); 
    mContext.startService(mIntent); 
    mContext.bindService(mIntent, mConnection, Context.BIND_AUTO_CREATE); 
} 

Dienst beim Start

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, START_STICKY, startId); 
    Log.d("SERVICE","Started"); 
    return START_STICKY; 
} 
+0

Werfen Sie einen Blick auf diese Antwort von @fedepaol [Android Hintergrunddienst neu gestartet wird, wenn die Anwendung getötet] [1] [1]: http://stackoverflow.com/questions/15452935/android-background -service-is-neustart-wenn-die-applikation-gekillt ist – Maclaren

+0

das ist nicht das wonach ich spreche, es geht darum, es gar nicht neu starten zu wollen! Ich will es nicht mal schließen.Danke, aber ich denke es ist etwas nachdem ich los bin. – RuAware

+0

Ihr Service kann und wird vom System getötet, Sie können nichts dagegen tun. Aber wenn du klebrig begonnen hast, wirst du wieder mit einer Null Absicht gestartet. Nach dem Neustart müssen Sie Ihren Status wiederherstellen. – JohanShogun

Antwort

6

Kurze Antwort: Sie können es nicht. Jede Android-App kann vom System oder vom Benutzer gelöscht werden, wenn das System Speicher beansprucht oder der Benutzer die App aus der Liste der zuletzt verwendeten Apps entfernt. Dies ist ein Android-Design und alle Apps müssen sich daran halten. Der einzige (kleine) Verbesserung, die Sie haben können, ist die Einstellung der Dienst als Foreground service:

, wo das System es etwas der Benutzer aktiv bewusst und damit kein Kandidat für die Tötung, wenn wenig Speicher zu hält. (Es ist noch theoretisch möglich, dass der Dienst unter extremem Speicherdruck von der aktuellen Vordergrundanwendung, getötet zu werden, aber in der Praxis sollte dies kein Problem sein.)

+1

Vielen Dank für Ihre Hilfe. Der startForeground() stoppt den Dienst beim Neustart, wenn der Benutzer die App durch den Finger wischt. Wonach ich gesucht habe. Ich verstehe, dass wenn der Speicher niedrig ist, wird es neu starten, die ich handle. Aber das ist bisher in keinem meiner Tests passiert. – RuAware

1

Verwenden startForeground()

Der Nachteil ist, dass Sie muss eine Benachrichtigung bereitstellen.

0

Wird das Tag android: process = "anyName" in Ihrem Manifest nützlich sein? Dadurch wird der Service in einem anderen Prozess Ihrer App ausgeführt.

http://developer.android.com/guide/topics/manifest/service-element.html#proc

Da es nach wie vor durch das System beendet werden kann von anderen bestellt, wenn wenig Speicher ausgeführt wird, aber es wird durch das Schließen der App nicht beenden. Ich hoffe es hilft.

1

Wie Mimmo sagte: Sie können nicht. Das System kann tatsächlich Apps/Dienste beenden, wenn der Arbeitsspeicher knapp ist. Auch Benutzer können dies tun. Entweder mit der Schaltfläche "Schließen" in den App-Einstellungen oder durch Wischen mit der App. Wischen zum Schließen ist wie der Kraftstopp. Die App/der Dienst wird beim Schließen einer App nicht neu gestartet. So funktioniert das System. Probieren Sie es selbst aus, laden Sie den Task Killer herunter und töten Sie Facebook zum Beispiel. Wenn Sie den Taskkiller einige Sekunden später neu starten, wird Facebook wieder aktiv. Öffne jetzt Facebook und verwende die Swipe-Funktion, um es zu töten. Starten Sie nun den Task Killer erneut. Du wirst sehen, dass Facebook nicht mehr läuft. Auch so funktioniert das System. Das Festlegen des Diensts als Foreground-Dienst wird ebenfalls nicht helfen.

Verwandte Themen