2010-07-23 6 views
55

Auf dieselbe Weise kann eine Web- oder Desktop-App drei oder n Ebenen haben - UI, Geschäft, Daten zum Beispiel - wie ist die vorgeschlagene Struktur für eine Android-Anwendung? Wie gruppierst du Klassen zusammen, welche Ebenen hast du usw.?Android-Anwendungsarchitektur - Was ist das vorgeschlagene Modell?

Ich starte gerade Android dev (eine Internet-basierte App, die auf eingehende Benachrichtigungen reagieren muss) und habe kein echtes Gefühl für die Struktur, die ich anstrebe. Vorschläge geschätzt.

Antwort

15

Die Aktionen, Ansichten und Aktivitäten in Android sind in der Art der Arbeit mit der Android-Benutzeroberfläche gebacken und sind eine Implementierung eines Model-View-Viewmodel-Musters, das strukturell ähnlich ist (in der gleichen Familie) Model View-Controller .

Nach meinem besten Wissen gibt es keine Möglichkeit, aus diesem Modell auszubrechen. Es kann wahrscheinlich getan werden, aber Sie würden wahrscheinlich alle Vorteile verlieren, die das vorhandene Modell hat, und müssen Ihre eigene UI-Ebene neu schreiben, damit es funktioniert.

Sie können MVC in den folgenden finden:

  • Sie definieren Ihre user interface in verschiedenen XML-Dateien durch Auflösung/Hardware usw.
  • Sie Ihre resources in verschiedenen XML-Dateien definieren, indem locale usw.
  • Sie speichern Daten in SQLite oder Ihre benutzerdefinierten Daten in/assets/Ordner, lesen Sie mehr über resources and assets
  • Sie erweitern Klassen wie ListActivity, TabActivity und Verwendung der XML-Datei, indem inflaters
  • Sie können so viele Klassen erstellen, wie Sie für Ihr Modell wünschen, und Ihre eigenen Pakete haben, die als Struktur
  • Viele Utils waren bereits handeln für dich geschrieben. DatabaseUtils, Html,

Es gibt kein einzelnes MVC-Muster, dem Sie folgen könnten. MVC sagt nur mehr oder weniger, dass Sie nicht Daten mischen und anzeigen sollten, so dass z. Ansichten sind dafür verantwortlich, dass Daten oder Klassen, die Daten verarbeiten, die Sicht direkt beeinflussen.

Aber trotzdem, wie Android mit Klassen und Ressourcen umgeht, sind Sie manchmal sogar gezwungen, dem MVC-Muster zu folgen. Komplizierter in meiner Meinung sind die Aktivitäten, die manchmal für die Ansicht verantwortlich sind, aber dennoch als Controller in der gleichen Zeit fungieren.

Wenn Sie Ihre Ansichten und Layouts in den XML-Dateien definieren, laden Sie Ihre Ressourcen aus dem Ordner res, und wenn Sie mehr oder weniger vermeiden, diese Dinge in Ihrem Code zu vermischen, folgen Sie trotzdem einem MVC-Muster.

+17

Sie beantworten seine Frage nicht.Sie haben über die Architektur der Benutzerschnittstelle geantwortet. Ich denke, seine Frage ist mehr über die globale Anwendungsarchitektur: sollten wir separate Ebenen wie Präsentation (= MVC), Geschäftslogik und Datenpersistenz erstellen. Dieses Muster ist in Webanwendungen sehr verbreitet. – clemp6r

+0

Vereinbart mit @ clemp6r. –

15

IMHO, Android "will" ein MVC-Muster folgen, aber anzeigen & Controller sind in der Regel wirklich in Aktivitäten gekoppelt.

Es macht Unit-Test härter und es ist schwierig, die Single Responsibility Principle zu gehorchen.

Ich fand a really nice Android architecture presented here, da könnte eine Idee sein. Alles ist lose gekoppelt, so viel einfacher zu testen und zu bearbeiten.

Offensichtlich gibt es viele andere Möglichkeiten (wie das MVP-Muster (Model View Presenter) - und here are answers talking about MVP in Android), aber Sie sollten immer noch einen Blick darauf werfen.

+0

'Android" möchte "einem MVC-Muster folgen" wie kommt es? –

15

Ich weiß, dass diese Frage sehr alt ist, aber ich denke, dass es für andere nützlich sein kann, wie ich, die durch eine Suche darauf stolpern.

Ich arbeite jetzt seit 9 Monaten an Android von einem serverseitigen Hintergrund aus, wo vollständige Komponententests und geschichtete Architekturen üblich sind und gut funktionieren.

Durch viele Versuch und Irrtum und ich würde dringend empfehlen, die Model View Presenter Muster, nicht Model View Controller.

Ein großes Problem, das ich gefunden habe ist, dass Activities/Fragments einen Lebenszyklus haben, der außerhalb Ihrer Kontrolle ist und zu unerwarteten Problemen führen kann.

Zum Beispiel möchte unsere Android-App im Querformat auf Tablets verwendet werden. Wir tun dies in OnCreateView() oder OnCreate().

Auf einem Nexus 7 ist die Standardansicht Hochformat, was passiert ist, dass es die Aktivität im Hochformat startet, sagt unser Code dann zu Landschaft und Android schafft schließlich die activity Klasse 3 Mal!

Wir haben Netzwerkanforderungen an onCreate angeschlossen und sie werden in diesem Fall 3 mal passiert.

Sicher, können wir Logik hinzufügen, um nach doppelten Anrufen zu suchen, aber, meiner Meinung nach, wäre es besser, architektonisch zu versuchen, die UI von der Geschäftslogik zu trennen.

Meine Empfehlung wäre, das Fabrikmuster zu verwenden, um Referenten aus der Aktivität zu erstellen, aber sicherzustellen, dass die Fabrik immer nur die gleiche Instanz zurückgibt. Der Präsentator kann dann Logik enthalten, um eine Netzwerkanforderung auszuführen, nach Duplikaten zu suchen und zwischengespeicherte Ergebnisse und allgemeine Geschäftslogik zurückzugeben.

Wenn Ergebnisse aus dem Netzwerk Anruf zurückkehren, entweder Post an einen Bus wie Otto, die die Aktivität (Register für das Ereignis auf onResume() und Deregistrierung bei onPause()) registriert hat, oder sicherstellen, dass die Callback-Schnittstelle durch die Aktivität umgesetzt wurde auf die letzte Aktivität im Moderator aktualisiert.

Auf diese Weise Code in der presenter nach unten ist Einheit testbar und nicht auf flockigen UI-Layer-Tests angewiesen.

0

Hier ist ein dediziertes Projekt für Android Architecture blueprints mit gut dokumentierten Quellcodes. Alle basieren auf dem MVP-Muster mit mehreren Drehungen. Überprüfen Sie auch die comparison der verschiedenen Lösungen auf der Grundlage von Code-Zeilen, Testbarkeit, Lernkosten, ihre Unterstützung für die zunehmende Komplexität der Daten. Es hängt von der speziell entwickelten App und dem Kontext (Time to Market, Entwickler, Zukunftspläne etc.) ab, welcher Blueprint am besten passt.