2012-03-27 10 views
1

Ich bin neu in Android-Entwicklung, ich versuche, eine iOS-App auf Android zu portieren. Grundsätzlich muss meine App mit einem Server in Echtzeit mit Socket IO kommunizieren. Es stellt eine Verbindung zum Server her und verarbeitet dann die verschiedenen Nachrichten, bis der Server die Verarbeitung der Anforderung abgeschlossen hat.Singleton oder Service für Socket-Verbindung

In meiner IOS-App verwende ich ein Singleton-Muster, um die Anfragen an meinen WebSocket-Server zu senden, und ich benutze die gleiche Instanz, um die Serverantwort zu delegieren. In Android würde ich das gleiche Muster verwenden, mit einem Callback-Objekt in meiner Aktivität, um den Benutzer umleiten nach Erhalt einer Serverantwort.

Ich brauche meine App, um die Socket-Verbindung offen zu halten, bis wir den richtigen Status vom Server erhalten, auch wenn die App im Hintergrund läuft.

Einige Leute empfehlen, den Dienst mit Broadcast-Empfänger anstelle von Singleton zu verwenden. Ist es in meinem Fall das Beste?

Antwort

10

Verwenden Sie eine Service ist genau das, was ich für sehr ähnliche Zwecke (Socket-Kommunikation für Bluetooth und TCP/IP-Anwendungen) getan habe und denke, dass Sie sicherlich eine Service verwenden möchten, wenn die Kommunikation selbst wenn der Benutzer fortfahren sollte hat die Anwendung geschlossen.

Ein Service ist im Wesentlichen ein Mittel zum Ausführen von Code auf dem UI-Thread (aber natürlich können Sie dann andere Threads darin starten), aber ohne eine Benutzeroberfläche, im Gegensatz zu Activity, die eine Benutzeroberfläche zugeordnet hat.

Wenn Sie versuchen würden, dies in einer statischen Singleton-Klasse zu tun, wie Sie als Alternative vorschlagen, dann denke ich, das Problem wäre, dass Sie keine sehr gute Kontrolle über den Lebenszyklus davon hätten. Wenn der Benutzer von der Anwendung weg navigiert, dann verstehe ich, dass es Sache des Frameworks ist, wenn er den Prozess und alle damit verbundenen statischen Objekte entfernt. Wenn Singleton-Klassen mit Daten gefüllt sind und Sie Ihre Anwendung beenden und später zu der Anwendung zurückkehren, können Sie feststellen, dass die "alten" Singleton-Instanzen noch nicht gefunden wurden. Aus diesem Grund habe ich in meiner Anwendung (die eine sehr große Menge an globalen Zuständen verwendet) darauf zurückgegriffen, die tatsächlichen Instanzen meiner Singletons in einer Erweiterung der Klasse .Application zu halten, um (hoffentlich) ihren Lebenszyklus besser zu kontrollieren.

Mit einem Service haben Sie einen gut definierten Lebenszyklus mit entsprechenden Lifecycle Rückrufe (onCreate(), onDestroy(), etc.) genauso wie mit einem Activity tun.

+0

Vielen Dank für diese Antwort Trevor Page! Ok, ich gehe mit einem Dienst mit einem anderen Thread, um das zu implementieren. Aber wie kann ich meinen Service und meine Aktivitäten miteinander kommunizieren lassen? Die Aktivität könnte über Socket Io eine Anforderung erstellen, und der Dienst muss die Statusaktualisierung an die verschiedenen Aktivitäten übermitteln. Muss ich eine Broadcast für jede Komponente implementieren? –

+1

Ok ich fand, dass ich meinen Dienst mit meinen Aktivitäten binden muss, um damit zu interagieren. Aber ich bin immer noch verwirrt über die Methode, die ich verwenden könnte, um den Service (die Socket-Verbindung) Ergebnisse in meiner Tätigkeit zu erhalten? –

+2

Ok, wenn Sie herausgefunden haben, wie Sie zwischen meinem Dienst und meiner Aktivität auf beide Arten kommunizieren können. Ich brauche einen IBinder für den Aufruf des Dienstes von meiner Aktivität und ich brauche einen BroadcastReceiver, um die Serverergebnisse in meiner Aktivität zu erhalten, hoffe, dass es jemandem helfen könnte. –

2

Ja, definitiv eine Service verwenden. Vom docs:

A Service eine Anwendungskomponente ist, die entweder eine Wunsch der Anwendung einen länger laufenden Betrieb durchzuführen, während nicht mit dem Benutzer

der Interaktion Während eines Singleton mit für eine Weile funktionieren könnte, Ihre Anwendung wäre anfällig dafür, vom Betriebssystem getötet zu werden, wenn sie in den Hintergrund tritt, es sei denn, Sie haben eine Service. Wenn Sie mit dem Singleton-Muster mehr Komfort haben, können Sie implementieren es in einem Singleton und dann einfach binden Sie es an eine Service einfach, um seinen Lebenszyklus zu halten, aber das scheint mehr ein Durcheinander als es wert ist. Beachten Sie, dass Sie keine Netzwerkvorgänge für den Benutzeroberflächenthread ausführen dürfen und standardmäßig ein Dienst im Benutzeroberflächenthread ausgeführt wird. Sie müssen einen anderen Thread hochfahren, um Ihre Arbeit zu erledigen.

Ich sehe nichts in Ihrem Beitrag, der eine BroadcastReceiver erfordert, obwohl vielleicht einige netzwerkbezogene Sendemitteilungen, die nützlich sein könnten wie android.net.ConnectivityManager.CONNECTIVITY_ACTION.

+0

Vielen Dank für Ihre Antwort. Können Sie mir die Antwort von Travor Page für den Sendepunkt? –