2010-06-29 6 views
10

Ich versuche, eine Android-App zu refactor/redesign. Derzeit habe ich eine UI-Aktivität (Activity 1), die eine DataThread erstellt. Dieser Thread ist für die Netzwerk-E/A verantwortlich und interagiert (stellt Daten zur Verfügung) mit der UI-Aktivität über eine handler.Android Service interagiert mit mehreren Aktivitäten

Jetzt möchte ich eine weitere Aktivität hinzufügen (eine neue Benutzeroberfläche mit Video) - Activity 2. Activity 1 ist immer noch die Haupttätigkeit. Activity 2 wird aufgerufen, wenn der Benutzer auf eine Schaltfläche unter Activity 1 klickt. Activity 2 's Daten kommt auch von der DataThread.

Meine Idee ist es, die Logik meines DataThread in einem Android Service (DataService) zu setzen. Meine Frage ist - kann mehr als auf Aktivität gleichzeitig an meine DataService binden? Gibt es eine Möglichkeit, dem Dienst mitzuteilen, dass er nur Daten für eine bestimmte Aktivität bereitstellen soll?

Andere Ideen sind willkommen?

Vielen Dank im Voraus.

Antwort

4

Normalerweise binde ich meinen Dienst von der Application-Klasse und habe irgendeine Art von Controller-Klasse (wie ein "Vermittler" ich denke ... nicht sicher, wie alle diese Muster benannt sind) in der Anwendung, die Kommunikation zwischen Diensten und was auch immer die aktive Aktivität ist.

Dies würde bedeuten, dass Sie Ihre eigene Anwendungsklasse schreiben und dem Manifest mitteilen, diese zu verwenden. Ich ging mehr ins Detail zu diesem Prozess in einem früheren Thread:

More efficient way of updating UI from Service than intents?

Sie könnten den Überblick über die „momentan aktiv“ Aktivität halten, indem die Anwendungsklasse (auch eine Referenz auf sich selbst in onResume Senden im Beispiel erklärt über). Dies kann erreicht werden, indem Sie Ihre Aktivitäten von einer gemeinsamen Basisklasse ableiten, die eine Möglichkeit bietet, Ihre Application-Klasse zu erhalten (casting from getApplicationContext), und in dieser Basisklasse onResume eine Referenz an die Anwendung senden. Anschließend können Sie beispielsweise Aktivitäten anhand des Namens bei Ihrem DataServiceController registrieren und Nachrichten nur dann an die aktuelle Aktivität senden, wenn sie beim Controller registriert sind, um sie zu empfangen.

+0

Ich suche nach einer Lösung wie dieser, gibt es ein funktionierendes Beispiel oder einen Link, um mehr Details über diese Implementierung zu erhalten, thx – Sam

+7

@Rich Wie schaffen Sie es sauber zu lösen vom Dienst, wenn Ihre Anwendung beendet wird, wenn Sie es gebunden haben in Ihrer Anwendungsklasse? Da Application # onTerminate() nie auf Produktionsgeräten aufgerufen wird, siehe JavaDoc http://developer.android.com/reference/android/app/Application.html –

+0

@SvenJacobs Die einzige Möglichkeit, die ich mir vorstellen kann: Lassen Sie den Service rufen ' stopSelf() 'nach einiger Zeit, wenn alle Aktivitäten pausiert sind. Aktivitäten müssen dem Dienst in diesem Fall ihren Status mitteilen, wenn sie pausiert werden. Aktivitäten rufen niemals 'unbindService()' auf, und der Dienst wird für jede onResume() jeder Aktivität an den 'applicationContext' gebunden. – OneWorld

6

Auf jeden Fall können mehr als eine Aktivität an Ihren Dienst gebunden sein. Sie erhalten einen onBind() für jeden, der bindet. Ihr Dienst würde dann idealerweise die Logik der Interaktion mit mehreren Aktivitäten handhaben, indem er sie mit Hilfe einer ID oder der Absicht (mit Ihren eigenen IDs für jede Aktivität als Extras) von onBind() in Ihrem Dienst identifiziert. Sie könnten dann veranlassen, dass der Service einen Hintergrund-Thread für jede Aktivität spawnt, die an ihn gebunden ist.

+3

@JoakimEngstrom also warum hast du es nicht bearbeitet, damit es klarer ist? – SMT