Android: Holen Sie sich das Ergebnis aus einem service
Habe ich android-service, die ich brauche, um ein Ergebnis zurückgeben, nachdem es gestartet wurde.
Also:
1) ich starte den Dienst
2) Der service etwas tut
3) Den Dienst gibt ein Ergebnis zurück,
Dachte ich, vielleicht kann ich eine singleton-Klasse, um das Ergebnis mitnehmen. Erstellt habe ich eine singleton-Klasse, um die service-speichern Sie das Ergebnis in es und dann nehmen Sie das Ergebnis aus dem Dienst eine Tätigkeit. Hier ist der code der Klasse:
public class Result {
//SIGLETON DECLARATION
private static Result mInstance = null;
public static Result getInstance() {
if (mInstance == null) {
mInstance = new Result();
}
return mInstance;
}
private Result() {
}
//CODE
Object result;
boolean resultIsSet = false;
public void deletePreviousResult() {
this.result = null;
resultIsSet = false;
}
public void setResult(Object result) {
Log.w("result", "setResult");
this.result = result;
resultIsSet = true;
}
public Object getResult() {
Log.w("result", "getResult");
while(resultIsSet == false) {}
return this.result;
}
Hier ist der code, den ich verwenden, um das Ergebnis zu erhalten:
public int getInfo() {
Result.getInstance().deletePreviousResult();
//start the service and ask to save the result in singleton class
Intent myIntent = new Intent(mInstanceContext, MediaPlayerService.class);
myIntent.setAction("getInfo");
mInstanceContext.startService(myIntent);
//take the result
return (Integer) Result.getInstance().getResult();
}
Was ist zu tun in onStartCommand
ist:
Result.getInstance().setResult(mMediaPlayer.getCurrentPosition());
wo mMediaPlayer
ist ein MediaPlayer-Objekt.
Aber das problem ist, dass wenn setResult
soll auch genannt werden, in onStartCommand
es wird nie aufgerufen! Warum? Ist mein Ansatz falsch?
Natürlich, was Sie tun, ist das: Ergebnis.getInstance().setResult(mMediaPlayer.getCurrentPosition()); wo mMediaPlayer ist ein MediaPlayer-Objekt 😉
Nur zu überqueren überprüfen, haben Sie erklärt, der service im manifest? Was Basisklasse Ihre Dienste erweitert Service oder IntentService oder ein anderer?
Es erstreckt sich Service und es wird erklärt 🙂
InformationsquelleAutor user1315621 | 2012-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diesem code hast du in
getInfo()
:davon ausgegangen, dass, wenn Sie anrufen
startService()
der Dienst ist gestartet undonStartCommand()
heißt synchron, so dass in der next-Anweisung können Sie das Ergebnis mitResult.getInstance().getResult()
.Leider, es funktioniert nicht so. Aufruf
startService()
ist nicht, wie der Aufruf einer Methode auf ein Objekt. Was Sie tun, wenn Sie rufenstartService()
ist, dass Sie sagen, Android, die Sie möchten, dass der Dienst gestartet werden, bei der nächsten moment. DaonStartCommand()
im Dienst aufgerufen werden muss auf dem Haupt-thread, in der Regel bedeutet dies, dass Android wird beginnen, Ihr service-und call -onStartCommand()
auf das nächste mal, wenn Sie Android-bekommt-regler der main-thread (ie: wenn alle Ihre Aktivität Methoden zurückgegeben haben). In jedem Fall können Sie nicht bestimmen, Wann der Dienst gestartet wird oder wennonStartCommand()
aufgerufen werden. Es ist ein asynchrone nennen, so müssen Sie verlassen sich auf eine Rückruf Mechanismus. Dies bedeutet, dass Sie brauchen, um zu schreiben, eine Art callback-Methode, die den Dienst aufrufen, wenn es getan hat, die Arbeit und möchte das Ergebnis an Sie.Gibt es verschiedene Möglichkeiten, dies zu tun. Sie können die service-senden Sie eine Absicht auf Ihre Aktivität. Sie können die service-broadcast-Intent mit den Ergebnissen. Sie binden konnte, um den service und registrieren Sie eine callback-listener (siehe Entwickler-Dokumentation für gebundene Dienstleistungen). Es gibt wahrscheinlich auch andere Möglichkeiten zu.
Sie könnten wahrscheinlich laufen Sie die getResult() in einen hintergrund-thread, so dass es nicht zu blockieren den Haupt-thread ausgeführt Ihren Dienst. So Dinge, die einfach bleiben?
InformationsquelleAutor David Wasser