2012-06-18 10 views
14

Ich bin neu in der Android-Programmierung, daher stehe ich vor einigen allgemeinen Problemen bei der Auswahl der besten Möglichkeit, meine App zu entwickeln.Wie kann der Android-Dienst die Benutzeroberfläche der Aktivität aktualisieren, mit der er gestartet wurde?

Was ich tun möchte, ist im Grunde ein Media Player. Ich möchte, dass der Media Player auf einem Dienst ausgeführt wird, weil er auch dann wiedergegeben werden soll, wenn die Aktivität nicht angezeigt wird.

Meine Frage ist, wie kann ich die Benutzeroberfläche für meine Aktivität abhängig von der Service-Arbeitsfluss aktualisieren (zum Beispiel der Song ändert und ich möchte seinen Namen angezeigt werden)?

Ich glaube, ich einen lokalen Broadcast Manager, um Absichten zu senden von meinem Dienst zu meiner Tätigkeit und rufen UI-Updates (scheint es so, nicht wahr?)

ABER ... ich mag meinen Dienst nutzen könnte zu tun ein paar Sachen während der Musikwiedergabe (wie das Abfragen/Aktualisieren der Datenbank). Aus diesem Grund habe ich darüber nachgedacht, den Dienst auf einem anderen Prozess (oder Thread?) Auszuführen.

SO .. Ich denke, Dienst auf einem anderen Prozess läuft, werde ich nicht in der Lage sein, lokale Broadcast-Manager zu verwenden (ist das richtig?).

Ich hoffe ich erklärte, was sind meine Zweifel ... kann jemand helfen?

vielen dank!

Antwort

15

Verwenden Sie eine asynchrone Aufgabe in Ihrem Dienst, um die Arbeit zu erledigen, die Sie im Hintergrund ausführen müssen. Wenn Sie die Benutzeroberfläche aktualisieren müssen, verwenden Sie die Methode "progressUpdate" der asynchronen Aufgabe, um eine Übertragung an alle interessierten Aktivitäten zu senden.

Pseudo Beispiel.

Aktivität

onCreate -> Startservice und neue broadcastReceiver erstellen. Stellen Sie sicher, dass Sie die onReceive-Methode überschreiben und auf die spezifische Absicht testen.

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 

    broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(yourActionType)) { 
       //do work here 
      } 
     } 
    }; 

onResume -> registrieren Sie sich als Rundfunkempfänger

IntentFilter filter = new IntentFilter(); 
    filter.addAction(yourActionType); 
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter); 

Dienst

onCreate -> Broadcast-Manager erstellen.

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 

onStartCommand -> erstellen und führen Sie bei Bedarf eine neue asynchrone Task aus. (OnStart mehrmals aufgerufen werden kann)

Async Aufgabe

doInBackground -> Start, was Hintergrundaufgabe die Sie benötigen. In diesem Fall Musik spielen. Erstellen Sie regelmäßig Anrufe publishProgress

onProgressUpdate -> sendBroadcast anzeigt, aktualisiert Status

Intent broadcastIntent = new Intent(yourActionType); 
    broadcastIntent.putExtra(whateverExtraData you need to pass back); 
    mLocalBroadcastManager.sendBroadcast(broadcastIntent); 

OnPostExecute -> sendBroadcast angibt Aufgabe

+0

Dank endete viel.aber was ist mit Broadcast-Nachrichten? Sind sie nicht unpraktisch, um lokal genutzt zu werden? – super

+0

@super Ich habe meine Antwort so bearbeitet, dass sie ein Beispiel für die Verwendung lokaler Broadcasts enthält. Stellen Sie sicher, dass android-support-v4.jar in Ihren Bibliotheken enthalten ist, wenn Sie auf eine alte API-Verison abzielen. – Mike

+0

vielen Dank. Ich werde dich wissen lassen, wie es geht;) – super

Verwandte Themen