Aktivität, AppCompatActivity, FragmentActivity und ActionBarActivity: Wann welche verwenden?

266

Ich komme von iOS, wo es einfach ist und Sie einfach einen UIViewController verwenden. In Android scheinen die Dinge jedoch viel komplizierter zu sein, mit bestimmten UIComponents für bestimmte API-Ebenen. Ich lese BigNerdRanch für Android (das Buch ist ungefähr 2 Jahre alt) und sie schlagen vor, dass ich Activitymeine als Host verwende FragmentActivities. Ich dachte jedoch, dass Activityes veraltet ist.

Was genau sollte ich für API Level 22 (mit einer Mindestunterstützung für API Level 15 oder 16) sowohl zum Hosten der Komponenten als auch für die Komponenten selbst verwenden? Gibt es Verwendungszwecke für all diese oder sollte ich fast ausschließlich einen oder zwei verwenden?

Jameson
quelle
1
Sie werden keine FragmentActivityHosts hosten . Sie hosten nur Fragments. Bei neueren Android-Versionen wurde die ActivityKlasse selbst aktualisiert, um sie direkt zu hosten. Zur Unterstützung älterer Versionen FragmentActivitywurde eingeführt.
Ravi Thapliyal
5
In ähnlicher Weise hatten ies mit API 11+ ActivityUnterstützung für eine ActionBar. Dies wurde bei älteren Versionen durch ActionBarActivityfirst unterstützt, die jetzt veraltet und durch ersetzt wurden AppCompatActivity. Da beide Klassen erweitert werden FragmentActivity, unterstützen sie auch Hosting Fragment.
Ravi Thapliyal

Antworten:

327

Ich dachte, Aktivität sei veraltet

Nein.

Was genau sollte ich für API Level 22 (mit einer Mindestunterstützung für API Level 15 oder 16) sowohl zum Hosten der Komponenten als auch für die Komponenten selbst verwenden? Gibt es Verwendungszwecke für all diese oder sollte ich fast ausschließlich einen oder zwei verwenden?

Activityist die Basislinie. Jede Aktivität erbt Activitydirekt oder indirekt von.

FragmentActivitydient zur Verwendung mit dem Backport von Fragmenten, die in den Bibliotheken support-v4und gefunden support-v13wurden. Die native Implementierung von Fragmenten wurde in API Level 11 hinzugefügt, was niedriger ist als Ihre vorgeschlagenen minSdkVersionWerte. Der einzige Grund, warum Sie dies FragmentActivityspeziell berücksichtigen müssten, ist, wenn Sie verschachtelte Fragmente verwenden möchten (ein Fragment, das ein anderes Fragment enthält), da dies in nativen Fragmenten bis API Level 17 nicht unterstützt wurde.

AppCompatActivityist aus der appcompat-v7Bibliothek. Grundsätzlich bietet dies einen Backport der Aktionsleiste. Da die native Aktionsleiste in API Level 11 hinzugefügt wurde, benötigen Sie dies nicht AppCompatActivity. Aktuelle Versionen von appcompat-v7bieten jedoch auch einen begrenzten Backport der Material Design-Ästhetik in Bezug auf die Aktionsleiste und verschiedene Widgets. Die Verwendung appcompat-v7hat Vor- und Nachteile , die weit über den Rahmen dieser speziellen Antwort zum Stapelüberlauf hinausgehen.

ActionBarActivityist der alte Name der Basisaktivität von appcompat-v7. Aus verschiedenen Gründen wollten sie den Namen ändern. Es sei denn , einige Drittanbieter - Bibliothek , die Sie verwenden , auf ein beharrt ActionBarActivity, sollten Sie es vorziehen , AppCompatActivityüber ActionBarActivity.

Also, wenn Sie minSdkVersionim Bereich von 15-16 liegen:

  • Wenn Sie das Backported Material Design-Aussehen wünschen, verwenden Sie AppCompatActivity

  • Wenn nicht, aber verschachtelte Fragmente möchten, verwenden Sie FragmentActivity

  • Wenn nicht, verwenden Sie Activity

Nur aus Kommentar als Hinweis hinzufügen: AppCompatActivityErweitert FragmentActivity, damit jeder, der Funktionen von FragmentActivityverwenden muss, verwenden kann AppCompatActivity.

CommonsWare
quelle
Was ist, wenn ich den Material Design-Look verwenden und auch verschachtelte Fragmente verwenden möchte? Erbt AppCompatActivity von FragmentActivity?
Orcun Sevsay
4
@ MiloRambaldi: Ja, FragmentActivityist ein Vorfahr von AppCompatActivity. Ich empfehle zwar nicht, verschachtelte Fragmente zu verwenden, aber in dem Maße, in dem verschachtelte Fragmente überhaupt funktionieren, AppCompatActivitywerden verschachtelte Fragmente unterstützt.
CommonsWare
Vielen Dank für die ausführliche Antwort @CommonsWare. Könnten Sie sagen, welches minSDK es erlauben würde, nur Activitydie neuesten Informationen ohne support-v7nicht zurückportiertes Materialdesign zu erhalten ? Mein Ziel ist min 19 Ziel 25
jugutier
1
@jugutier: Um zu verwenden Theme.Material, benötigen Sie minSdkVersion21 oder höher.
CommonsWare
83

Activityist die Basisklasse aller anderen Aktivitäten, ich glaube nicht, dass sie veraltet sein wird. Die Beziehung zwischen ihnen ist:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' bedeutet hier Vererbung. Die Referenz gesagt ActionBarActivityist veraltet, verwenden AppCompatActivitystatt.

Grundsätzlich ist die Verwendung AppCompatActivityimmer die richtige Wahl. Die Unterschiede zwischen ihnen sind:

  • Activity ist die grundlegende.
  • Basierend auf Activity, FragmentActivitybietet die Möglichkeit , zu verwenden Fragment.
  • Basierend auf FragmentActivity, AppCompatActivitybietet Funktionen ActionBar.
Ted Yu
quelle
2
elegante Antwort.
M. Kazem Akhgary 30.
69

2019: Verwendung AppCompatActivity

Zum Zeitpunkt dieses Schreibens (überprüfen Sie den Link, um zu bestätigen, dass er immer noch wahr ist) empfiehlt die Android-Dokumentation die Verwendung, AppCompatActivitywenn Sie eine App-Leiste verwenden.

Dies ist die rationale Gegebenheit:

Ab Android 3.0 (API-Level 11) verfügen alle Aktivitäten, die das Standarddesign verwenden, über eine ActionBar als App-Leiste. Über verschiedene Android-Versionen wurden der nativen ActionBar jedoch schrittweise Funktionen der App-Leiste hinzugefügt. Infolgedessen verhält sich die native ActionBar unterschiedlich, je nachdem, welche Version des Android-Systems ein Gerät möglicherweise verwendet. Im Gegensatz dazu werden die neuesten Funktionen zur Version der Symbolleiste der Supportbibliothek hinzugefügt und sind auf jedem Gerät verfügbar, das die Supportbibliothek verwenden kann.

Aus diesem Grund sollten Sie die Toolbar-Klasse der Support-Bibliothek verwenden, um die App-Leisten Ihrer Aktivitäten zu implementieren. Durch die Verwendung der Symbolleiste der Support-Bibliothek können Sie sicherstellen, dass Ihre App auf den unterschiedlichsten Geräten ein einheitliches Verhalten aufweist. Das Symbolleisten-Widget bietet beispielsweise ein Materialdesign-Erlebnis auf Geräten mit Android 2.1 (API-Stufe 7) oder höher. Die native Aktionsleiste unterstützt jedoch kein Materialdesign, es sei denn, auf dem Gerät wird Android 5.0 (API-Level 21) oder höher ausgeführt.

Die allgemeinen Anweisungen zum Hinzufügen einer Symbolleiste sind

  1. Fügen Sie die Support-Bibliothek für v7 appcompat hinzu
  2. Erweitern Sie alle Ihre Aktivitäten AppCompatActivity
  3. Erklären Sie im Manifest, dass Sie wollen NoActionBar.
  4. Fügen Sie ToolBardem XML-Layout jeder Aktivität ein hinzu.
  5. Holen Sie sich die ToolBarin jeder Aktivität onCreate.

Weitere Informationen finden Sie in der Dokumentation . Sie sind ziemlich klar und hilfreich.

Suragch
quelle
Hallo @Suragch, danke dafür. Angenommen, ich mache heute eine App, die NUR 21 unterstützt. In der Tat möchte ich niemals eine Aktionsleiste oder App-Leiste (eher eine Vollbild-App). Studio schlägt vor (16. November), möglicherweise "Abwärtskompatibilität (AppCompat)" zu verwenden . Mein Bauchgefühl ist, AppCompat NICHT zu verwenden. Was ist Ihre Expertenmeinung? Ich kann dir nur danken, danke.
Fattie
Ich bin kein Experte, daher kann ich Ihnen keine Expertenmeinung geben, aber die Dokumentation schlägt vor, so viele Geräte wie möglich zu unterstützen, damit ich das tue. Ich benutze AppCompat mit all meinen Apps und es hat bisher gut funktioniert. Ich nehme an, wenn Sie Pre 21 wirklich nicht unterstützen möchten, können Sie den Studio-Vorschlag ignorieren.
Suragch
50

Für eine API-Mindeststufe von 15 möchten Sie verwenden AppCompatActivity. So MainActivitywürde Ihr beispielsweise aussehen:

public class MainActivity extends AppCompatActivity {
    ....
    ....
}

Um das zu verwenden AppCompatActivity, stellen Sie sicher, dass Sie die Google Support Library heruntergeladen haben (Sie können dies in Ihrem Tools -> Android -> SDK-Manager überprüfen). Fügen Sie dann einfach die Gradle-Abhängigkeit in die gradle.build-Datei Ihrer App ein:

compile 'com.android.support:appcompat-v7:22:2.0'

Sie können dies AppCompatals Hauptfunktion Activityverwenden, um dann Fragmente oder andere Aktivitäten zu starten (dies hängt davon ab, welche Art von App Sie erstellen).

Das BigNerdRanch-Buch ist eine gute Ressource, aber ja, es ist veraltet. Lesen Sie es, um allgemeine Informationen zur Funktionsweise von Android zu erhalten. Erwarten Sie jedoch nicht, dass die von ihnen verwendeten Klassen auf dem neuesten Stand sind.

adao7000
quelle
OK, ich habe diese Abhängigkeit in meiner gradle.build-Datei. Wenn ich zum Beispiel eine Tabelle mit mehreren Zeilen erstelle (wie bei jeder Notes-Anwendung), ist mein Hauptbildschirm ein AppCompat und alles andere, was Hosts auch ein AppCompat sind? Muss ich grundsätzlich nur AppCompat verwenden?
Jameson
Ihr AppCompat bläst also eine Layoutressource auf, die das Design angibt (Tabelle mit einer Reihe von Zeilen). Angenommen, Sie möchten eine neue Seite öffnen, wenn Sie auf eine Zeile klicken. Sie können einen onClickListener so einstellen, dass eine neue AppCompat-Aktivität oder ein Fragment geöffnet wird.
adao7000
Ab dem 3. August hat BigNerdRanch eine neue Ausgabe seines Buches: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410
1
@ adao7000 paaren , wo sie , dass für 15 erwähnt hat oder über Sie AppCompatActivity verwenden können - dachte ich v7 in android.support.v7.app für mindestens sdk ist erforderlich ist 7.
codebased
1
@codebased android.support.v7 kann ab API-Ebene 9 verwendet werden. Quelle: developer.android.com/topic/libraries/support-library/…
adao7000
30

ActivityKlasse ist die Grundklasse. (Das Original) Es unterstützt die Fragmentverwaltung (seit API 11). Wird seine reine Verwendung nicht mehr empfohlen, da seine Spezialisierungen weitaus besser sind.

ActionBarActivitywar in einem Moment der Ersatz für die Aktivitätsklasse, weil es einfach war, die ActionBar in einer App zu handhaben.

AppCompatActivityist der neue Weg, da die ActionBar nicht mehr empfohlen wird und Sie stattdessen die Symbolleiste verwenden sollten (dies ist derzeit der ActionBar-Ersatz). AppCompatActivity erbt von FragmentActivity. Wenn Sie also Fragmente verarbeiten müssen, können Sie dies (über den Fragment-Manager). AppCompatActivity ist für JEDE API, nicht nur für 16+ (wer hat das gesagt?). Sie können es verwenden, indem Sie es compile 'com.android.support:appcompat-v7:24:2.0'in Ihre Gradle-Datei einfügen. Ich benutze es in API 10 und es funktioniert perfekt.

Joaquin Iurchuk
quelle
1
"Die Aktionsleiste ist jetzt veraltet" - Die Aktionsleiste ist nicht veraltet. "Sie müssen stattdessen die Symbolleiste verwenden" - Apps müssen nicht verwendet werden Toolbar.
CommonsWare
@CommonsWare Ok, es ist nicht veraltet, aber seine Verwendung wird in seiner reineren Form (der alten) nicht mehr empfohlen. Nun, wenn Sie eine Aktionsleiste in der App haben wollen , sollten Sie es manuell hinzufügen eine Toolbar.
Joaquin Iurchuk
"Seine Verwendung wird in seiner reineren Form nicht mehr empfohlen" - Ich habe in der Dokumentation oder in offiziellen Blog-Posts nichts gesehen, was Ihre Behauptung rechtfertigen würde. Hast du einen Link?
CommonsWare
@ CommonsWare Du bist die Eminenz hier und du hast Recht. Nur Richtlinien für das Materialdesign empfehlen die Verwendung einer Symbolleiste als Aktionsleiste. Vielleicht sollte ich meine Antwort löschen, da sie nicht genau ist. Vielen Dank
Joaquin Iurchuk
2
Ab der Support Library-Version 26.0.0 (veröffentlicht im Juli 2017) wurde die minimale unterstützte API-Stufe für alle Support Library-Pakete auf Android 4.0 (API Level 14) geändert. Quelle: developer.android.com/topic/libraries/support-library/…
Andrea Leganza
12

Hier herrscht große Verwirrung, insbesondere wenn Sie veraltete Quellen lesen.

Die grundlegende ist Activity, die Fragmente zeigen kann. Sie können diese Kombination verwenden, wenn Sie eine Android-Version> 4 verwenden.

Allerdings gibt es auch eine Support - Bibliothek , die die anderen Klassen umfassen Sie erwähnt: FragmentActivity, ActionBarActivityund AppCompat. Ursprünglich wurden sie verwendet, um Fragmente in Android-Versionen <4 zu unterstützen, aber tatsächlich werden sie auch verwendet, um Funktionen aus neueren Android-Versionen (z. B. Materialdesign) zurück zu portieren.

Der letzte ist AppCompat, die anderen 2 sind älter. Die Strategie, die ich verwende, besteht darin, immer zu verwenden AppCompat, damit die App für Backports von zukünftigen Versionen von Android bereit ist.

blumengrün
quelle
Danke dir! OK, also kann ich AppCompat anstelle von Aktivität verwenden, um zu hosten ... was? Um andere AppCompats zu hosten? Oder um FragmentActivities zu hosten?
Jameson
Eine Aktivität hostet normalerweise nur andere Fragmente ... Und keine Sorge um FragmentActivity, es ist eher eine "Basis" -Klasse, von der alle anderen ausgefallenen XXXActivity abgeleitet sind.
Mehdi
Aber welche Klasse sollte mein AppCompat hosten? Noch ein AppCompat oder was anderes?
Jameson
Sie müssen hier nur eines verstehen: Aktivitäten enthalten Fragmente. Aktivitäten werden übrigens von nichts anderem gehostet, sie können nicht verschachtelt werden. Appcompat ist nur eine andere Art von Aktivität. Danach können Sie fortfahren und Fragmente verschachteln, aber die Verwaltung wird immer komplexer.
Flower_green
1
Nein, Sie verwenden Appcompat als Aktivität und hosten Fragmente, keine Fragmentaktivitäten.
Flower_green
7

Wenn Sie darüber reden Activity, AppcompactActivity, ActionBarActivityetc etc ..

Wir müssen über Basisklassen sprechen, die sie erweitern. Zuerst müssen wir die Hierarchie der Superklassen verstehen.

Alle Dinge werden aus dem Kontext gestartet, der für alle diese Klassen eine Superklasse ist.

Context ist eine abstrakte Klasse, deren Implementierung vom Android-System bereitgestellt wird. Es ermöglicht den Zugriff auf anwendungsspezifische Ressourcen und Klassen sowie das Aufrufen von Vorgängen auf Anwendungsebene wie das Starten von Aktivitäten, das Senden und Empfangen von Absichten usw.

Context wird gefolgt von oder erweitert von ContextWrapper

Der ContextWrapper ist eine Klasse, die die Context- Klasse erweitert und einfach alle Aufrufe an einen anderen Context delegiert. Kann in Unterklassen unterteilt werden, um das Verhalten zu ändern, ohne den ursprünglichen Kontext zu ändern.

Jetzt erreichen wir Activity

Die Aktivität ist eine Klasse, die ContextThemeWrapper erweitert. Dies ist eine einzelne, fokussierte Aufgabe , die der Benutzer ausführen kann. Fast alle Aktivitäten interagieren mit dem Benutzer, daher kümmert sich die Aktivitätsklasse darum, ein Fenster für Sie zu erstellen

Die unten aufgeführten Klassen können nur erweitert werden, werden jedoch von ihrem Nachkommen intern erweitert und bieten Unterstützung für bestimmte APIs

Die SupportActivity ist eine Klasse, die Activity erweitert, eine Basisklasse zum Zusammenstellen von Kompatibilitätsfunktionen

Die BaseFragmentActivityApi14 ist eine Klasse , die sich SupportActivity , die eine Basisklasse ist es Klasse beschränkt ist , sondern es ist zu erweitern , indem BaseFragmentActivityApi16 die Funktionalität zu unterstützen V14

Die BaseFragmentActivityApi16 ist eine Klasse , die sich BaseFragmentActivityApi14 , die eine Basisklasse für {@code ist FragmentActivity } in der Lage sein zu verwenden v16 APIs. Es ist jedoch auch eine eingeschränkte Klasse, wird jedoch von FragmentActivity erweitert, um die Funktionalität von V16 zu unterstützen.

jetzt FragmentActivty

Die FragmentActivity ist eine Klasse, die BaseFragmentActivityApi16 erweitert und die unterstützungsbasierten Fragment- und Loader-APIs verwenden möchte.

Wenn Sie diese Klasse im Gegensatz zur integrierten Fragment- und Loader-Unterstützung der neuen Plattform verwenden, müssen Sie die Methoden getSupportFragmentManager()und getSupportLoaderManager()verwenden, um auf diese Funktionen zuzugreifen.

ActionBarActivity ist Teil der Support Library. Support-Bibliotheken werden verwendet, um neuere Funktionen auf älteren Plattformen bereitzustellen. Beispielsweise wurde die ActionBar in API 11 eingeführt und ist standardmäßig Teil der Aktivität (abhängig vom eigentlichen Thema). Im Gegensatz dazu gibt es auf den älteren Plattformen keine ActionBar . Daher fügt die Support-Bibliothek eine untergeordnete Aktivitätsklasse ( ActionBarActivity ) hinzu, die die Funktionalität und Benutzeroberfläche der ActionBar bereitstellt

Im Jahr 2015 ist ActionBarActivity in Version 22.1.0 der Support Library veraltet. Stattdessen sollte AppCompatActivity verwendet werden.

Die AppcompactActivity ist eine Klasse, die FragmentActivity als Basisklasse für Aktivitäten erweitert, die die Aktionsleistenfunktionen der Unterstützungsbibliothek verwenden.

Sie können Ihrer Aktivität eine Aktionsleiste hinzufügen , wenn Sie auf API-Ebene 7 oder höher ausgeführt werden, indem Sie diese Klasse für Ihre Aktivität erweitern und das Aktivitätsthema auf Theme.AppCompatoder ein ähnliches Thema festlegen

Hier

Ich beziehe mich auf diese beiden, eins , zwei

Farhana
quelle
3

Da sich der Name wahrscheinlich in zukünftigen Versionen von Android ändern wird (derzeit ist AppCompatActivityes der neueste, aber er wird sich wahrscheinlich irgendwann ändern), glaube ich, dass es gut ist, eine Klasse zu haben Activity, die sich erweitert, AppCompatActivityund dann erstrecken sich alle Ihre Aktivitäten von dieser. Wenn sie morgen den Namen AppCompatActivity2ändern, müssen Sie ihn beispielsweise nur an einer Stelle ändern.

TeuerBelly
quelle
0

AppCompatActivity erweitert FragmentActivity erweitert BaseFragmentActivityApi16 erweitert BaseFragmentActivityApi14 erweitert SupportActivity erweitert Activity

So Aktivität ist schneller als alle & AppCompatActivity ist die beste von allen.

Ahamadullah Saikat
quelle