2010-12-14 17 views
0

Ich habe eine Aktivität, die das Starten und Stoppen eines Hintergrunddienstes über steuert. ein Knopf klicken. Wenn der Dienst nicht ausgeführt wird, wird auf der Schaltfläche "SERVICE STARTEN" angezeigt. Wenn der Dienst ausgeführt wird, wird die Schaltfläche "SERVICE STOPPEN" angezeigt. Die Logik, was beim Klick auf die Schaltfläche passieren soll, wird auf die gleiche Weise umgeschaltet (wenn der Dienst nicht läuft, starten wir ihn und binden ihn mit einem Klick an die Schaltfläche und wir stoppen ihn und lösen die Verbindung, wenn der Dienst ausgeführt wird).Android Hintergrund Service Statusinformationen

Bitte werfen Sie einen Blick auf den Code-Auszug für weitere Informationen.

Bind und unbind

Während der Service kann derzeit nur durch die STOP-Taste SERVICE gestoppt werden, bin ich den Dienst freibleibend in onPause und es in onResume rebinding. Macht das Sinn? onPause und onResume lifecycle Methoden werden oft aufgerufen, daher ist dies eine Menge an bindendem und unverbindlichem Overhead, aber da onPause immer aufgerufen wird, bevor die Anwendung beendet werden könnte, ist dies der beste Ort für das Freigeben von Service Bindings und das Vermeiden von Leaks.

BACK-Taste

Ich bin auch nicht sicher, was zu tun ist, wenn Sie die BACK-Taste gedrückt wird. Sollte der Dienst im Hintergrund weiterlaufen, wenn die BACK-Taste gedrückt wird (das gleiche Verhalten wie in der Android Music-Anwendung)? Wenn ja, was wäre der richtige Weg, um die Informationen zu erhalten, die der Dienst ausführt (wie onSaveInstanceState wird nicht aufgerufen auf BACK-Taste gedrückt Ich frage mich, was wäre die sauberste Möglichkeit, den Zustand der Anwendung - in meinem Fall die isServiceRunning boolesche Variable)? Ich benötige diese Informationen, um den richtigen Text auf der Start/Stopp-Schaltfläche (in Bezug auf den Status des Hintergrunddienstes) zu setzen, wenn die Aktivität erneut gestartet wird. Eine mögliche Alternative wäre auch, dass die Aktivität normal beendet werden kann, ohne dass Informationen zum Dienststatus gespeichert werden (isServiceRunning). Ich könnte diese Informationen in OnCreate vom ActivityManager bekommen, wo ich nach den laufenden Diensten fragen könnte.

Auf der anderen Seite, wenn der Dienst auf der Schaltfläche BACK gestoppt werden sollte drücken, wo soll ich den Dienst stoppen? onDestroy wäre eine natürliche Antwort auf diese Frage, aber ich sehe mich Problemen gegenüber, da onDestroy auch beim Neustarten der Aktivität aufgerufen wird (z. B. bei einer Orientierungsänderung), und ich möchte den Dienst in diesem Fall nicht stoppen.

public class ServiceController extends Activity { 
public void onStartClick(View v) { 
    if (!isServiceRunning) { 
    button.setText("STOP"); 
    isServiceRunning = true; 
    startService(...) 
    bindService(...) 
    } else { 
    button.setText("START"); 
    isServiceRunning = false; 
    unbindService(...) 
    stopService(...) 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (isServiceRunning) { 
    button.setText("STOP"); 
    bindService(...); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (mBoundAccService != null) { 
    unbindService(...); 
    } 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null) { 
    isServiceRunning = savedInstanceState.getBoolean(ID_SERVICE_RUNNING); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBoolean(ID_SERVICE_RUNNING, isServiceRunning); 
} 
    } 

Antwort

0

Erstens .. Ich habe das Konzept der Bindung onPause() nicht verstanden. Wenn Sie dies tun, wird der Dienst mit Ihrer Aktivität gestartet und beendet (was auch bedeutet, dass der Dienst im Wesentlichen eine Aktivität ist).

Dies ist, was meine Anwendung getan hat.

Wenn der Benutzer von (offensichtlich) Aktivität gestartet hat, hat der Dienst mit dem folgenden Code gestartet.

startService (neue Absicht (this, MyService.class));

Und wenn der Benutzer Stop (entweder gleiche Taste oder eine andere Taste)

Stopservice (neu Intent (diese, MUMService.Klasse));

In der Service-Klasse habe ich onStart und onDestroy Methoden implementiert, um den Service-Prozess zu steuern.

ich außer Kraft nicht die Zurück-Taste (Diese von Android wird abgeraten), aber wenn Sie sein müssen .. hier ist der Code (in Ihrer Aktivität)

@Override

public boolean onKeyDown (int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK) {

+0

Unbinding in onPause den Dienst nicht stoppen, weil der Service wird mit startService gestartet (ich kann gerade nicht mit dem Dienst kommunizieren, während die Aktivität pause ist, aber der Dienst läuft weiter). - Ich suche nicht so sehr nach Implementierungstipps, sondern nach Design-Tipps. – Igor