web-dev-qa-db-de.com

Fragmentierte Fragmente gegen Aktivitäten fragmentieren oder nicht fragmentieren. Warum sollte ich mehr als eine Aktivität verwenden?

Es gibt viele Diskussionen darüber, ob Sie Activities oder Fragments..__ verwenden sollten. Beispiel:

Die meisten Diskussionen, die ich gefunden habe, wurden vor Android 4.2 veröffentlicht.
Mit Android 4.2 erfand Google verschachtelte Fragmente .

Daher sehe ich eigentlich keinen Grund mehr, mehr als eine Activity zu verwenden.

In der frühen Phase von Fragments sollten sie in Apps verwendet werden, um Tablets und Smartphones gleichzeitig auf komfortable Weise zu unterstützen. 

So haben Sie beispielsweise eine ListView, die ein Detail View öffnen kann, wenn Sie auf ein Element klicken. Auf einem Smartphone würden wir ListView ersetzen und stattdessen das ausführliche View anzeigen. Ein Tablet kann, anstatt die Liste durch die Detailansicht zu ersetzen, gleichzeitig Views anzeigen.


Jetzt mit verschachtelten Fragments gibt es viele andere Möglichkeiten. Wenn Sie ein einzelnes Activity verwenden möchten, können Sie allgemeine Informationen im Activity speichern, auf das jedes Fragment zugreifen kann. 

Außerdem könnten Fragments, die Fragments verschachtelt haben, auch Informationen für ihre Kinder Fragments speichern. 

Mit Fragments kann ich problemlos das Views wiederverwenden, ich kann mehr als einen Fragment gleichzeitig anzeigen und kann problemlos aus einem Fragment einen Dialog bilden. Dies alles würde mich wahrscheinlich nicht mehr als nur einige Copy & Paste-Aktionen erfordern.

Wenn ich stattdessen Activities benutze, muss ich mich ernsthaft ändern, um dies zu erreichen. 


Ich habe vor kurzem ein Application implementiert, in dem ich problemlos zwei Fragment-ViewPager verwenden konnte, um die Dinge wirklich schön und dynamisch zu machen (einige Arten von: Today's Information - Yesterday's Information). Meiner Meinung nach Fragments machen uns das Leben einfacher :) 


Fragen:

  • Warum sollte ich mehr als einen Activity verwenden?

Könnten Sie ein gutes Beispiel geben, in dem die Verwendung mehrerer Activities sinnvoller ist, anstatt Fragments zu verwenden?

  • Gibt es gute Beispiele, bei denen Sie keine andere Wahl haben, als Activities zu verwenden?

Ich denke, die meisten der größeren Frameworks wie Maps, YouTube und co unterstützen Fragments bereits. Daher müssen wir uns nicht auf Activities verlassen. Auch ist es ziemlich einfach, mit NavigationBar, TabHosts, ViewPager, ActionBar umzugehen, falls Sie Fragments verwenden. 


From Udacity: 

Warum erstellen Sie nicht immer eine Aktivität mit vielen Fragmenten?

  1. Erhöhte Komplexität
  2. Harder Intent Handling
  3. Schwer zu lesen, zu warten und zu testen
  4. Gefahr einer festen Kupplung
  5. Sicherheitsbedenken
70
Frame91

Zunächst einmal stimme ich Ihnen zu, dass es möglich ist, eine große Anwendung mit nur einer Aktivität und verschachtelten Fragmenten zu erstellen. Das ist der Spaß an Software - Sie können die gleiche Funktionalität durch verschiedene Ansätze erreichen. Die Wahl, mehrere Aktivitäten zu verwenden, hängt von meinen persönlichen Präferenzen für Einkapselung, Wiederverwendbarkeit und Testbarkeit ab.

Wenn ich ein Widget habe, das in anderen Anwendungen wiederverwendet werden kann, mache ich es zu einem Fragment. Beispielsweise verfügt meine App über eine Schaltfläche "Mit Server synchronisieren", und ich habe ein benutzerdefiniertes Fragment erstellt, das mithilfe von Fortschrittsbalken den Synchronisierungsprozess visuell darstellt. Es ist leicht vorstellbar, dass eine andere Anwendung dieses Widget verwenden kann. Deshalb habe ich es als Fragment entwickelt.

Wenn ich Aufgaben innerhalb meiner App wechsle, sodass die neue Aufgabe konzeptionell unabhängig von der vorherigen Aufgabe ist, verwende ich eine neue Aktivität. Auf der ersten Seite meiner App werden Sie beispielsweise aufgefordert, einen Benutzer auszuwählen. Sobald Sie auf einen Benutzer geklickt haben, schicke ich Sie zum Hauptmenü für diesen Benutzer. Dieses Hauptmenü für den Benutzer wird in einer neuen Aktivität angezeigt. 

Nun stellen wir uns eine große, komplexe App und ein Team von Entwicklern vor, die diese App entwickeln sollen. Wenn die App in verschiedene Aktivitäten unterteilt werden kann, ist es konzeptionell sehr einfach, die Aufgaben aufzuteilen. Jede Aktivität ist eine eigene Sandbox, daher ist die parallele Entwicklung einfach und kann von der Einheit geprüft werden. Wenn es gemeinsame Bedürfnisse gibt, sollte das Team dennoch Fragmente entwickeln und natürlich wiederverwenden. Ich sollte hinzufügen, dass die Wiederverwendung von Code in der Softwareentwicklung nicht oft genug geschieht, aber wenn dies richtig gemacht wird, sollte es viele wiederverwendbare Fragmente geben. 

Nehmen wir an, es ist an der Zeit, die App zu testen. Ihr Testteam kann jede Aktivität als eigene Blackbox behandeln. Dies ist einfacher zu testen als eine einzige große App, die auf einer einzelnen Aktivität und Tonnen verschachtelter Fragmente beruht. Dies ist besonders wichtig, wenn ein Fehler vorliegt. Wenn ein Fehler existiert, der nicht offensichtlich ist, weiß ich zumindest, dass der Umfang des Fehlers auf eine einzige Aktivität aus vielen beschränkt ist.

Zusammenfassend kann ich davon ausgehen, dass Sie Ihre App als Einzelperson entwickeln. Daher beeinflussen Ihre Entwicklungsentscheidungen keine anderen Personen. Ihre Perspektive würde sich wahrscheinlich ändern, wenn Sie eine App mit einem größeren Team entwickeln, und ich hoffe, dass meine Antwort in diesem Licht sehr sinnvoll ist.

95
Steven

Du hast recht. Man könnte viel mit Fragmenten alleine machen. Entsprechend der Activity-Klasse ist eine Aktivität jedoch eine einzelne, fokussierte Sache, die der Benutzer ausführen kann. Ich neige immer dazu, meine Bewerbung in Aktivitäten auf oberster Ebene und darüber hinaus in Fragmente zu unterteilen.

Zum Beispiel ist hier eine Situation, in der mehrere Aktivitäten sinnvoll sind. Unsere Anwendungen verfügen über eine bestimmte Funktionalität, die erweitert werden kann, wenn sich der Benutzer anmeldet. Der Benutzer kann diese eingeschränkte Funktionalität jedoch vor der Anmeldung noch verwenden. Sie können beispielsweise nur dann Elemente kommentieren, wenn Sie angemeldet sind. In diesem Fall ist unsere MainActivity zeigt möglicherweise die gesamte Funktionalität. Wenn der Benutzer einen Kommentar abgeben möchte, bitten wir ihn, sich anzumelden, indem er seine Anfrage speichert und eine Aktivität LoginActivity startet, die die Anmeldung/Registrierung ausführt und das richtige Ergebnis festlegt, wenn er fertig ist. In unserem aufrufenden Fragment oder in unserer Aktivität prüfen wir, ob das Ergebnis LOGIN_SUCCESS ist oder ob der Benutzer derzeit angemeldet ist und die ausstehende Anforderung bearbeiten. Was ich versuche zu sagen, ist, dass der Aktionsfluss von Login eine separate Aktivität sein sollte. Ansonsten wäre die Handhabung wahrscheinlich durcheinander geraten. Auf diese Weise kann jede Aktion, für die ein Login erforderlich ist, startActivityForResult (LOGIN) aufrufen und sich als ausstehende Aktion speichern. Nach dem Setzen des Ergebnisses konnten wir dann die Handhabung in super.onActivityResult implementieren. Dies ist natürlich alles theoretisch, man könnte Login ohne Probleme in einem Fragment implementieren. Der Code wird jedoch definitiv als FUed angezeigt.

Eine andere Situation, in der Sie eine Aktivität benötigen, ist, wenn Ihre Aktivität einen exportierten Service bereitstellt. Angenommen, Sie sind Entwickler eines "Datei-Uploaders" und erhalten die Absicht, Dateien hochzuladen. In diesem Fall ist es sehr praktisch, eine Aktivität zu erstellen, die Anfragen zum Hochladen einer Datei benötigt.

Mit den aktuellen Updates umfasst die Funktionalität von Fragments jedoch die meisten Funktionen von Android-Apps und kann daher allein mit einer einzigen Host-Aktivität verwendet werden, um die Anforderungen einer App zu erfüllen. 

Allerdings ist Ihr ganzer "Host für eine einzige Aktivität" mit Daten eher eine schwache Verteidigung. Aktivitäten und genau Fragmente hat den gesamten Lebenszyklus, der die Save/Restore-Instanz über Bundles beinhaltet. Eine einzelne Host-Aktivität kann langlebig sein und mehrere Fragmente hosten, die möglicherweise mehrmals in einem einzigen Lebenszyklus ihrer Aktivität wiederverwendet werden. Es ist daher sehr wahrscheinlich, dass eine Aktivität, die alle diese Instanzen im Laufe der Zeit hält, ihren Ressourcenhaushalt übersteigt. Es liegt in der Verantwortung des Entwicklers, Daten in einem gemeinsam genutzten Kontext zu halten, wenn sie tatsächlich von mehreren Objekten gemeinsam genutzt werden. Dies ist ein Nachteil dieses Ansatzes. In unserem Beispiel ist es nicht sinnvoll, dass MainActivity ein zusätzliches Datenbyte verbraucht, da die Login-Fragmente gehostet wurden, wenn sie geschlafen und ihren Speicher bei Bedarf freigegeben haben könnte.

Am Ende kann ein guter Programmierer die gleiche Aufgabe ebenfalls erledigen.

2
Sherif elKhatib

Du hast vollkommen Recht!

Warum sollte ich mehr als eine Aktivität verwenden?

Könnten Sie ein gutes Beispiel geben, in dem die Verwendung mehrerer Aktivitäten sinnvoller ist, anstatt Fragmente zu verwenden? 

Gibt es gute Beispiele, bei denen Sie keine andere Wahl haben, als Aktivitäten zu verwenden?

Ich denke, die meisten größeren Frameworks wie Maps, YouTube und Co. unterstützen bereits Fragments. Daher müssen wir uns nicht auf Aktivitäten verlassen. Es ist auch ziemlich einfach, mit NavigationBar, TabHosts, ViewPager, ActionBar umzugehen, falls Sie Fragmente verwenden. 

Die Verwendung von Fragmenten ist nicht gut für das Aufblasen der Daten auf die Benutzeroberfläche, insbesondere für den Fall 

  • ConnectionTimeOut (oder wenig Internet), da die Initialisierung der Daten viel Zeit in Anspruch nahm .. Daher ist es manchmal besser, mit jeder Aktivität wenige Daten aufzublähen als jedes Fragment.

  • Oder um die Methode onActivityResult flexibler zu verwenden, ist die Verwendung von Aktivität auch besser als. Bsp. Sie können FileDialogChooser in Ihrer Anwendung aufrufen.

Das sind einige Fälle,

Vielen Dank,

2
Huy Tower

Für Ihre Fragen kann ich nur sagen, dass bei einer komplexen Benutzererfahrung oder einer komplexen App, die eine andere Hardwarekomponente verwenden muss, Aktivität statt Fragment verwendet werden muss.

Wenn Sie beispielsweise eine App mit einem Formular erstellen müssen, das über einen Schritt verfügt, der ein Foto aufnehmen soll, und dieses Foto dann für einige Arbeitsspeicheraufgaben (z. B. Gesichtserkennung) verwenden, die Speicher verwenden, müssen Sie diese Aufgabe vom Hauptauftrag trennen Taskaktivität, und personalisieren Sie die Berechtigung für Manifest, nur für diese Aktivität mehr Speicher zu verwenden.

Ein anderes Beispiel ist, wenn Sie schwache Speicheraktivität verwenden möchten (in Manifest können Sie Eigenschaften festlegen, die den Aktivitätsstack löschen und den Garbage Collector dazu zwingen, den Speicher zu bereinigen, wenn die Aktivität abgeschlossen ist.)

Die wahrscheinlichste Situation, die mehr Aktivität und Fragmentierung erfordert, ist die Benutzererfahrung der App. Wenn Sie einen Benutzer für die rechte Schublade benötigen, der ein Menü enthält, enthält jedes Fragment des Menüs eine Listenansicht, und jede Listenansicht muss detailliert sein. Sie können viele Tricks ausführen, um die richtige Schublade auszublenden und Animationen zu erstellen, um vom Fragment zum Detail zu gelangen. Die beste und einfachste Methode besteht darin, eine neue Aktivität für das Detail zu erstellen und diese mit einem separaten Logik-/Lebenszyklus vom Hauptfenster zu verwalten Tätigkeit mit der Schublade. Ich habe dies in zwei meiner Apps ausgewählt:

iMeal - https://play.google.com/store/apps/details?id=it.fullsix.chiccopappe

GGRugby - https://play.google.com/store/apps/details?id=it.f6.template

In dieser App befindet sich die Schublade in der Hauptfragmentaktivität. Jedes Menü ändert das Inhaltsfragment. Die Listenansicht im Inhaltsfragment ändert den Aktivitätskontext mit Absicht und wechselt in eine andere Aktivität.

Schließlich gibt es eine Situation, in der ich denke, dass Sie mit mehr als einer einzigen fragmentActivity arbeiten sollten ... aber dies ist mein Arbeitsmuster, wahrscheinlich können Sie einen Trick/Weg oder einen Spielraum finden, um etwas nur mit einer Aktivität und einem Fragment zu tun.

1
phemt.latd

Ich weiß, ich bin zu spät dafür, aber Square hat eine Meinung über Fragmente. Hier ist der Kern des Artikels:

Fragmente: Lektionen gelernt

Trotz ihrer Nachteile haben uns Fragmente unschätzbare Lehren beigebracht, die wir jetzt beim Schreiben von Apps erneut anwenden können:

  • Single Activity Interface: Es ist nicht erforderlich, für jeden Bildschirm eine Aktivität zu verwenden. Wir können unsere App in entkoppelte Widgets aufteilen und nach Belieben zusammenstellen. Dies macht das Animieren und den Lebenszyklus einfach. Wir können unsere Widgets in Ansichtscode und Controller-Code aufteilen.
  • Der Backstack ist keine aktivitätsspezifische Vorstellung. Sie können einen Backstack innerhalb einer Aktivität implementieren.
  • Es sind keine neuen APIs erforderlich. Alles, was wir brauchten, war von Anfang an dabei: Aktivitäten, Ansichten und Aufstellungsmöglichkeiten.

Sie müssen nicht mehr als eine Aktivität verwenden und Sie müssen keine Fragmente verwenden. Sie können nur benutzerdefinierte Ansichten mit ihren Präsentatoren verwenden.

Sie können es hier lesen: https://corner.squareup.com/2014/10/advocating-against-Android-fragments.html

Sie können die Mörtelbibliothek von Square auch hier finden: https://github.com/square/mortar

0
Penguin Blues