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);
}
}
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