Android: Was ist besser - mehrere Aktivitäten oder manuelles Wechseln der Ansicht?

115

Ich habe einige Apps für Android entwickelt und diese Frage bleibt immer:

Wie soll ich meine Benutzeroberfläche strukturieren? Sollte ich Aktivität für Aktivität starten und das Telefon verlassen, um die Schaltfläche "Zurück" zu aktivieren, oder sollte ich eine optimierte, aber komplexere Implementierung wählen, indem ich manuell die Ansicht wechsle und dann die Funktion "Zurück" manuell ausführe?

Was denkst du (oder weißt du) ist die bessere Praxis?

Danail
quelle
4
Beachten Sie für neue Leser, dass diese Frage ziemlich alt ist und es sich heute eher um "mehrere Fragmente oder mehrere Aktivitäten" als um "mehrere Ansichten oder mehrere Aktivitäten" handelt. Siehe UPDATE unter stackoverflow.com/a/10794086/199364 . Suchen Sie auch bei Google nach anderen Stackoverflow-Themen zu Fragmenten und Aktivitäten - viele gute Antworten.
ToolmakerSteve

Antworten:

99

Ich würde sagen, dass mehrere Aktivitäten fast immer sinnvoller sind. Ich glaube einfach nicht, dass Android dafür ausgelegt ist, ständig seine eigenen Ansichten zu wechseln - Sie verpassen so viel. Sie müssen Back selbst implementieren, Sie erhalten keine Interaktivitätsübergänge, Sie müssen viel interne Logik implementieren, um eine Anwendung im richtigen Zustand fortzusetzen. Wenn Sie Ihre App nicht in Aktivitäten unterteilen, wird es später viel schwieriger, den Ablauf Ihrer Anwendung zu ändern. Dies führt auch zu einer Mega-Aktivität, die viel schwieriger zu handhaben ist als viele kleinere Codeteile.

Ich kann mir nur schwer vorstellen, dass Geschwindigkeit wirklich ein Problem ist. Wenn dies der Fall ist, stimmt etwas nicht mit der Art und Weise, wie Sie die einzelnen Aktivitäten initialisieren. Ich habe beispielsweise versucht, serialisierbare Objekte zwischen Aktivitäten zu übergeben, und das erwies sich als unglaublich langsam. Als ich zu einer schnelleren Methode zum Übergeben von Objekten wechselte, stieg die Geschwindigkeit beim Starten von Aktivitäten immens an.

Ich finde es auch bezeichnend, dass in den Android-Richtlinien für Aktivität und Aufgabengestaltung das Wechseln der Ansicht überhaupt nicht erwähnt wird. Im Mittelpunkt steht ein Activity-as-View-Design.

Dan Lew
quelle
5
Nur um zu erwähnen, dass ich in letzter Zeit einige großartige Apps gesehen habe (zum Beispiel Pulse), die Animationen und reibungslose Übertragung zwischen ihren verschiedenen Ansichten verwenden, alles in einer Aktivität.
Danail
3
Ich stimme Ihnen zu, aber viele visuelle Effekte sind nur zwischen Ansichtsübergängen und nicht zwischen Aktivitäten verfügbar, die ein aufkommendes Problem zwischen Ergo und netter Codierung verursachen
AsTeR
Dies ist ein äußerst interessantes Thema. Ich habe zu diesem Zeitpunkt eine App, die letztendlich 4 Ansichten implementiert. Ich mache alles innerhalb einer Aktivität, die zu der in dieser Antwort angegebenen "Mega-Aktivität" geführt hat. Ich mache es in erster Linie, damit meine App genau wie ein iOS-Gegenstück aussieht und sich anfühlt. Ich bin damit einverstanden, dass es SCHWER davon abhängt, was Sie erreichen wollen. Tolle Frage und Antwort +1 :-)
Trompeten
Eine iOS-Benutzeroberfläche zu erstellen ist eine schlechte Idee. Hvis allein ist der falsche Grund, nicht mehrere Aktivitäten zu verwenden.
Slott
3
@ Daniel: Als ich zu einer schnelleren Methode zum Übergeben von Objekten gewechselt bin, hat sich die Geschwindigkeit beim Starten von Aktivitäten immens erhöht. Können Sie bitte einige zusätzliche Details oder Referenzmaterial dafür bereitstellen?
Bhargav Jhaveri
21

Ich möchte auf einige Fälle hinweisen, in denen eine einzelne Aktivität möglicherweise besser für eine Android-Anwendung mit mehr als einer Vollbildansicht geeignet ist:

  • Wenn die Anwendungsbildschirme eng miteinander verbunden sind und ein gemeinsames Objekt verwenden, an dem sie alle arbeiten. In diesem Fall erfordert das Weitergeben des Objekts möglicherweise ein Bundle und kann fehleranfällig sein, da Kopien davon vorhanden sind. Ein gutes Beispiel könnte ein Assistent sein . Ja, Sie könnten Statics verwenden, um auf das gemeinsame Objekt zuzugreifen, aber Statics können in Android gefährlich sein (denken Sie an Konfigurationsänderungen!).

  • Wenn Sie einige wirklich coole Animationen zwischen den Bildschirmen möchten. Vielleicht möchten Sie, dass ein Vogel auf einem Bildschirm abhebt und auf einem anderen Bildschirm landet. Versuchen Sie das, wenn jeder Bildschirm eine Aktivität ist!

Wenn andererseits einer Ihrer Bildschirme so gestaltet ist, dass er von einer beliebigen Anzahl anderer Anwendungen angezeigt wird, sollte dieser Bildschirm eine eigene Aktivität sein.

UPDATE März 2014:

An dieser Stelle sollte die Frage nun die Auswahl der Fragmente enthalten. Ich denke, dass Ansichten wahrscheinlich die am wenigsten wahrscheinliche Wahl der 3 sind: Aktivität, Fragment, Ansicht. Wenn Sie Bildschirme implementieren möchten, die die Schaltfläche "Zurück" verwenden, sollten dies entweder "Aktivitäten" oder "Fragmente" sein, da beide die Schaltfläche "Zurück" nativ verarbeiten. Fragmente müssen dem FragmentManager-Backstack hinzugefügt werden, damit die Zurück-Schaltfläche funktioniert. Das Verwalten von Fragmenten, Dialogen und dem Backstack kann jedoch etwas ärgerlich sein!

UPDATE September 2018:

Einige Entwickler bei Google empfehlen Apps für einzelne Aktivitäten mit der neuen Navigationsarchitekturkomponente .

gesättigt neun
quelle
DANKE, dass Sie UPDATE hinzugefügt haben, um über Fragmente zu sprechen. Stimmen Sie voll und ganz zu, dass die wichtige Wahl heute ist, wann Fragment vs Activity verwendet werden soll.
ToolmakerSteve
11

Denken Sie auch daran, dass Sie Ihre App mit mehreren implementieren Activities Benutzern dem Benutzer eine kohärentere Erfahrung mit der gesamten Plattform bietet. Ein Teil der Erfahrung wird durch die Verwendung der integrierten Google-Apps beeinflusst, sodass Benutzer Ihre Anwendung wahrscheinlich leichter verwenden können, wenn sie sich ähnlich verhält wie die bereits auf dem Telefon installierten.

Erich Douglass
quelle
4

Anders als bei anderen verwende ich eine Mischung aus beiden, zum Beispiel:
1. Es gibt ein Hauptmenü, wenn die Anwendung gestartet wird.
2. Sie klicken auf Suchen, gelangen zur Suchaktivität.
3. Dann gibt es eine Filterschaltfläche, die nur die Ansicht wechselt und anzeigt Sie filtern Optionen
4. Am Ende der Filteransicht befinden sich zwei Schaltflächen. Sie drücken auf "Suchen" oder "Abbrechen" und kehren wieder zur Suchansicht zurück (ohne die Aktivität zu wechseln).
5. Wenn der Benutzer das Telefon zurück drückt Klicken Sie auf die Schaltfläche, um zum Hauptmenü zurückzukehren, anstatt zu den Suchfilteroptionen. Was ich denke, ist das richtige Verhalten.

Verwenden Sie es so, wie sich der Benutzer natürlich fühlt. Und wenn Sie alles in einer Aktivität behalten, wird es komplex.

happyhardik
quelle
3

Es hängt alles von der Anwendung ab. Was möchten Sie erreichen, um eine bessere Leistung und eine reibungslosere Benutzeroberfläche zu erzielen? IMHO Ich bevorzuge den zweiten Ansatz, die Aktivitäten manuell zu steuern, auch wenn er komplexer ist, wie Sie angegeben haben. Dies ist ein Ansatz, den ich in meinem Android-Tabs-Projekt verwendet habe. Vielleicht möchten Sie auch einen Blick auf eine Klasse namens ActivityGroup werfen (nicht sicher, welches Paket). Sie ermöglicht Ihnen mehrere Aktivitäten, zwischen denen Sie wechseln können. Das Gute an dieser Klasse ist, dass Ihre Aktivitäten beim Wechseln nicht entladen werden, aber eine schlechte Sache ist, dass das Laden Ihrer Haupt-App länger dauert.

Nur meine Meinung.

Greg
quelle
1

Das Problem beim Wechseln der Ansicht, auf das ich gestoßen bin, wird auch durch den Garbage Collector verursacht. Scheint, dass GC ausgelöst wird, wenn Sie die Aktivität verlassen und nicht die Ansicht. Das Ändern von Registerkarten mit beispielsweise recht komplexen untergeordneten Ansichten führt daher fast zwangsläufig zu einer Stapelüberlaufausnahme.

zorglub76
quelle
3
StackOverflowError kommt in Java so gut wie nur vor, wenn Sie eine unendliche Rekursion haben. Vielleicht denken Sie an OutOfMemoryError? Als Java-Programmierer sollten Sie sich wirklich keine Gedanken darüber machen, wann oder wo der Garbage Collector ausgelöst wird.
Samstag,
2
in android stackoverflow tritt auf, wenn die ansichtshierarchie ebenfalls zu tief ist.
Danail
0

Ich habe so viele Probleme mit dem Layout mehrerer Aktivitäten gehabt, dass ich davon dringend abraten kann, es sei denn, es gibt einen guten Grund, es auszuwählen.

Nachteil mehrerer Aktivitäten

Bei Verwendung mehrerer Aktivitäten ist es sehr schwierig, Code umzugestalten, um Daten von Aktivitäten zurückzugeben.

Wenn Sie eine Unteraktivität aufrufen, wird die Hauptaktivität möglicherweise beendet. Beim Debuggen auf einem anständigen Gerät tritt dies jedoch nie auf. Daher müssen Sie immer den Status speichern und den Status korrekt wiederherstellen. Das ist ein Schmerz. Stellen Sie sich vor, Sie rufen eine Methode für eine Bibliothek (dh eine andere Aktivität) auf, und Sie müssen sicherstellen, dass Ihre App bei der Rückgabe dieser Methode ihren Status vollständig mit allen Feldern aller Objekte in der VM (dh Aktivität) neu erstellen kann. restoreIntance). Das ist verrückt.

Umgekehrt, wenn Sie eine Subaktivität öffnen, wurde die VM möglicherweise getötet, seit die Subaktivität zum ersten Mal erzeugt wurde, z. B. wenn die App minimiert wird, während die Subaktivität angezeigt wird.

Es ist so viel sauberer, nur einen Ort zu haben, an dem der relevante App-Status gespeichert werden kann. In meinem Fall möchte ich den Benutzer, wenn die VM getötet wird, meistens zum Hauptbildschirm zurückführen und ihn seine Arbeit erneut erledigen lassen, weil ich es nicht tue Verbringen Sie keine 30-50 Stunden mit der Codierung von Funktionen zum Speichern / Fortsetzen, die 0,1% der Benutzer jemals erfahren werden.

Alternative

Fragmente oder verwalten Sie einfach Ihre Aktivitätsansichten selbst. Das manuelle Verwalten von Ansichten erfordert das Codieren einer Ansichtswechselalternative zu Aktivitäten / Fragmenten mit Übergängen, falls gewünscht.

Und nein, es bedeutet nicht eine Mega-Aktivität, wie in der akzeptierten Antwort vorgeschlagen, auf eine andere Weise als die eine Mega-App. Es erfordert nur ein bisschen mehr Design der Codebasis in passende Teile, da es etwas mehr Arbeit beim Verwalten von Ansichten gibt, obwohl viel weniger Arbeit beim Verwalten des Aktivitätsstatus und anderer Verrücktheiten erforderlich ist.

Möglicherweise relevant: Reddit: Es ist offiziell: Google empfiehlt offiziell die App-Architektur für einzelne Aktivitäten

Arberg
quelle