Attività, AppCompatActivity, FragmentActivity e ActionBarActivity: quando utilizzare quale?


266

Vengo da iOS, dove è facile e tu usi semplicemente un UIViewController. Tuttavia, in Android le cose sembrano molto più complicate, con alcuni componenti UIC per specifici livelli API. Sto leggendo BigNerdRanch per Android (il libro ha circa 2 anni) e mi suggeriscono di usarlo Activityper ospitare il mio FragmentActivities. Tuttavia, ho pensato che Activityfosse deprecato.

Quindi per API Level 22 (con un supporto minimo per API Level 15 o 16), cosa dovrei usare esattamente sia per ospitare i componenti, sia per i componenti stessi? Ci sono usi per tutti questi, o dovrei usarne uno o due quasi esclusivamente?


1
Non ospiterai FragmentActivityi. Ospiti solo messaggi di posta elettronica Fragment. Nelle versioni Android più recenti la Activityclasse stessa è stata aggiornata per ospitarle direttamente. Per supportare le versioni precedenti è FragmentActivitystata introdotta.
Ravi Thapliyal,

5
Allo stesso modo, con API 11+ Activityho avuto il supporto per un ActionBar. Questo è stato supportato nelle versioni precedenti attraverso la ActionBarActivityprima che ora è stata deprecata e sostituita con AppCompatActivity. Da allora, entrambe queste classi estendono FragmentActivitysupportano anche l'hosting Fragment.
Ravi Thapliyal,

Risposte:


327

Pensavo che l'attività fosse obsoleta

No.

Quindi per API Level 22 (con un supporto minimo per API Level 15 o 16), cosa dovrei usare esattamente sia per ospitare i componenti, sia per i componenti stessi? Ci sono usi per tutti questi, o dovrei usarne uno o due quasi esclusivamente?

Activityè la linea di base. Ogni attività eredita Activity, direttamente o indirettamente.

FragmentActivityè da utilizzare con il backport di frammenti trovati nelle librerie support-v4e support-v13. L'implementazione nativa di frammenti è stata aggiunta in API Level 11, che è inferiore ai minSdkVersionvalori proposti . L'unico motivo per cui dovresti prendere in considerazione FragmentActivityspecificamente è se vuoi usare frammenti nidificati (un frammento che contiene un altro frammento), poiché questo non era supportato nei frammenti nativi fino al Livello API 17.

AppCompatActivityviene dalla appcompat-v7biblioteca. Principalmente, questo offre un backport della barra delle azioni. Poiché la barra delle azioni nativa è stata aggiunta in API Level 11, non è necessario AppCompatActivity. Tuttavia, le versioni attuali appcompat-v7aggiungono anche un backport limitato dell'estetica Material Design, in termini di barra delle azioni e vari widget. Esistono vantaggi e svantaggi dell'utilizzo appcompat-v7, ben oltre lo scopo di questa specifica risposta Stack Overflow.

ActionBarActivityè il vecchio nome dell'attività di base da appcompat-v7. Per vari motivi, hanno voluto cambiare il nome. A meno che qualche libreria di terze parti che si sta utilizzando insiste su una ActionBarActivity, si dovrebbe preferire AppCompatActivitysopra ActionBarActivity.

Quindi, dato il tuo minSdkVersionnella gamma 15-16:

  • Se si desidera l'aspetto di Material Design con backport, utilizzare AppCompatActivity

  • In caso contrario, ma vuoi frammenti nidificati, usa FragmentActivity

  • In caso contrario, utilizzare Activity

Aggiungendo solo un commento come nota: si AppCompatActivityestende FragmentActivity, quindi chiunque abbia bisogno di usare le funzionalità di FragmentActivitypuò usare AppCompatActivity.


Cosa succede se desidero utilizzare l'aspetto Material Design e anche i frammenti nidificati? AppCompatActivity eredita da FragmentActivity?
Orcun Sevsay,

4
@MiloRambaldi: Sì, FragmentActivityè un antenato di AppCompatActivity. Anche se non consiglio di usare frammenti nidificati, nella misura in cui i frammenti nidificati funzionano affatto, AppCompatActivitysupporteranno i frammenti nidificati.
CommonsWare

Grazie per la risposta dettagliata @CommonsWare. Potresti dire quale minSDK consentirebbe solo di utilizzare la Activitymaggior parte delle ultime novità senza, ad support-v7esempio, il Material Design senza backport. Il mio obiettivo è il 19 obiettivo minimo 25
jugutier

1
@jugutier: per usare Theme.Material, hai bisogno minSdkVersiondi 21 o superiore.
CommonsWare,

83

Activityè la classe base di tutte le altre attività, non credo che sarà deprecata. La relazione tra loro è:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' significa eredità qui. Il riferimento detto ActionBarActivityè obsoleto, utilizzare AppCompatActivityinvece.

Quindi, in pratica, usare AppCompatActivityè sempre la scelta giusta. Le differenze tra loro sono:

  • Activity è quello di base.
  • Basato su Activity, FragmentActivityoffre la possibilità di usare Fragment.
  • Basato su FragmentActivity, AppCompatActivityfornisce funzionalità a ActionBar.

2
risposta elegante.
M.kazem Akhgary,

69

2019: utilizzare AppCompatActivity

Al momento in cui scrivo (controlla il link per confermare che è ancora vero), la documentazione di Android consiglia di utilizzare AppCompatActivityse stai utilizzando una barra delle applicazioni.

Questo è il dato razionale:

A partire da Android 3.0 (livello API 11), tutte le attività che utilizzano il tema predefinito hanno una barra delle azioni come barra dell'app. Tuttavia, le funzioni della barra delle app sono state gradualmente aggiunte ad ActionBar nativo su varie versioni di Android. Di conseguenza, ActionBar nativo si comporta in modo diverso a seconda della versione del sistema Android utilizzata da un dispositivo. Al contrario, le funzionalità più recenti vengono aggiunte alla versione di Toolbar della libreria di supporto e sono disponibili su qualsiasi dispositivo in grado di utilizzare la libreria di supporto.

Per questo motivo, è necessario utilizzare la classe Toolbar della libreria di supporto per implementare le barre delle app delle attività. L'uso della barra degli strumenti della libreria di supporto consente di garantire un comportamento coerente della tua app sulla più ampia gamma di dispositivi. Ad esempio, il widget Barra degli strumenti offre un'esperienza di progettazione materiale su dispositivi con Android 2.1 (livello API 7) o successivo, ma la barra delle azioni nativa non supporta la progettazione materiale a meno che il dispositivo non esegua Android 5.0 (livello API 21) o successivo.

Le indicazioni generali per l'aggiunta di una barra degli strumenti sono

  1. Aggiungi la libreria di supporto v7 appcompat
  2. Fai estendere tutte le tue attività AppCompatActivity
  3. Nel Manifesto dichiarare che si desidera NoActionBar.
  4. Aggiungi a ToolBaral layout xml di ogni attività.
  5. Ottieni il ToolBarin ogni attività onCreate.

Vedi le istruzioni per la documentazione per maggiori dettagli. Sono abbastanza chiari e utili.


Ciao @Suragch, grazie per questo. Supponiamo che oggi stia creando un'app che supporta SOLO 21 in poi. In effetti, come succede, non voglio mai una barra delle azioni o una barra delle app (più di un'app a schermo intero). Studio suggerisce (16 novembre) che potrei usare "Compatibilità con le versioni precedenti (AppCompat)" . Il mio istinto è NON usare AppCompat. Qual è la tua opinione di esperti? Posso solo ringraziarti, grazie.
Fattie,

Non sono un esperto, quindi non posso darti un parere di esperti, ma la documentazione suggerisce di supportare il maggior numero possibile di dispositivi, quindi è quello che faccio. Uso AppCompat con tutte le mie app e finora ha funzionato bene. Suppongo che se non vuoi davvero supportare pre 21, puoi ignorare il suggerimento di Studio.
Suragch,

50

Per un livello API minimo di 15, ti consigliamo di utilizzare AppCompatActivity. Ad esempio, il tuo MainActivityaspetto sarebbe simile al seguente:

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

Per utilizzare il AppCompatActivity, assicurati di aver scaricato la libreria di supporto di Google (puoi verificarlo in Strumenti -> Android -> gestore SDK). Quindi includi solo la dipendenza gradle nel file gradle.build della tua app:

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

Puoi usarlo AppCompatcome principale Activity, che può quindi essere utilizzato per avviare frammenti o altre attività (questo dipende dal tipo di app che stai costruendo).

Il libro BigNerdRanch è una buona risorsa, ma sì, è obsoleto. Leggilo per informazioni generali su come funziona Android, ma non aspettarti che le classi specifiche che usano siano aggiornate.


OK, ho quella dipendenza nel mio file gradle.build. Quindi, ad esempio, se sto creando una tabella con un mucchio di righe (come qualsiasi applicazione Notes), la mia schermata principale sarà un AppCompat e anche qualsiasi altra cosa che ospita sarà un AppCompat? Fondamentalmente devo solo usare AppCompat?
Jameson,

Quindi AppCompat gonfia alcune risorse di layout che specificano il design (tabella con un gruppo di righe). Ma supponiamo che tu voglia aprire una nuova pagina quando fai clic su una riga. Puoi impostare un onClickListener per aprire una nuova attività AppCompat o un frammento.
adao7000,

A partire dal 3 agosto, BigNerdRanch ha una nuova edizione del suo libro: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410

1
@ adao7000 mate dove ha menzionato che per 15 o più puoi usare AppCompatActivity - ho pensato che v7 in android.support.v7.app sia per minimo sdk richiesto è 7.
basato su codice

1
@codebased android.support.v7 può essere utilizzato avviato a livello API 9. Fonte: developer.android.com/topic/libraries/support-library/…
adao7000,

30

Activityla classe è la classe di base. (L'originale) Supporta la gestione dei frammenti (dall'API 11). Non è più raccomandato il suo puro utilizzo perché le sue specializzazioni sono decisamente migliori.

ActionBarActivityè stato in un attimo il sostituto della classe Activity perché rendeva semplice la gestione di ActionBar in un'app.

AppCompatActivityè il nuovo modo di procedere perché ActionBar non è più incoraggiato e dovresti invece usare Toolbar (che è attualmente la sostituzione di ActionBar). AppCompatActivity eredita da FragmentActivity, quindi se hai bisogno di gestire frammenti puoi (tramite Fragment Manager). AppCompatActivity è per QUALSIASI API, non solo 16+ (chi l'ha detto?). Puoi usarlo aggiungendo il compile 'com.android.support:appcompat-v7:24:2.0'tuo file Gradle. Lo uso in API 10 e funziona perfettamente.


1
"ActionBar è ora obsoleto": la barra delle azioni non è obsoleta. "devi usare Toolbar invece" - le app non devono essere utilizzate Toolbar.
Commons War

@CommonsWare Ok, non è deprecato ma il suo utilizzo non è più incoraggiato nella sua forma più pura (quella vecchia). Ora, se vuoi avere una barra delle azioni nella tua app , dovresti aggiungerla manualmente usando una barra degli strumenti.
Joaquin Iurchuk,

"il suo utilizzo non è più incoraggiato nella sua forma più pura" - Non ho visto nulla nella documentazione o nei post ufficiali del blog che giustifichi la tua richiesta. Avete un link?
Commons War

@CommonsWare Sei qui l'eminenza e hai ragione. Solo le linee guida per la progettazione dei materiali suggeriscono l'uso di una barra degli strumenti come barra delle azioni. Forse dovrei cancellare la mia risposta in quanto non è preciso. Grazie
Joaquin Iurchuk l'

2
A partire dalla Support Library versione 26.0.0 (rilasciata a luglio 2017), il livello API supportato minimo è stato modificato in Android 4.0 (API level 14) per tutti i pacchetti di librerie di supporto. fonte: developer.android.com/topic/libraries/support-library/…
Andrea Leganza,

12

C'è molta confusione qui, specialmente se leggi fonti obsolete.

Quello di base è Activity, che può mostrare frammenti. Puoi utilizzare questa combinazione se sei nella versione Android> 4.

Tuttavia, v'è anche una libreria di supporto che comprende le altre classi che hai citato: FragmentActivity, ActionBarActivitye AppCompat. Inizialmente venivano utilizzati per supportare frammenti nelle versioni Android <4, ma in realtà vengono anche utilizzati per il backport delle funzionalità dalle versioni più recenti di Android (ad esempio, la progettazione dei materiali).

L'ultimo è AppCompat, gli altri 2 sono più vecchi. La strategia che uso è quella di utilizzare sempre AppCompat, in modo che l'app sia pronta in caso di backport da future versioni di Android.


Grazie! OK, quindi posso usare AppCompat al posto di Activity per ospitare ... cosa? Per ospitare altri AppCompat? O per ospitare FragmentActivities?
Jameson,

Un'attività normalmente ospita solo altri frammenti ... E non preoccuparti di FragmentActivity, è più una classe "base", da cui derivano tutti gli altri fantasiosi XXXActivity.
Mehdi,

Ma quale classe dovrebbe ospitare il mio AppCompat? Un'altra AppCompat o qualcos'altro?
Jameson,

Hai solo una cosa da capire qui: le attività ospitano frammenti. Le attività non sono ospitate da nient'altro a proposito, non possono essere nidificate. Appcompat è solo un altro tipo di attività. Successivamente puoi continuare e nidificare i frammenti, ma questo inizia a essere complesso da gestire.
flower_green

1
No, si utilizza appcompat come attività e si ospitano frammenti, non attività frammentarie.
flower_green

7

Se si parla di Activity, AppcompactActivity, ActionBarActivityecc ecc ..

Dobbiamo parlare delle classi Base che stanno estendendo. Innanzitutto dobbiamo capire la gerarchia delle super classi.

Tutto parte da un contesto che è una super classe per tutte queste classi.

Il contesto è una classe astratta la cui implementazione è fornita dal sistema Android. Permette l'accesso a risorse e classi specifiche dell'applicazione, nonché up-call per operazioni a livello di applicazione come l'avvio di attività, la trasmissione e la ricezione di intenti, ecc.

Context è seguito o esteso da ContextWrapper

Il ContextWrapper è una classe che si estendono al contesto classe che semplicemente i delegati di tutti i suoi chiamate verso un altro contesto. Può essere suddiviso in sottoclassi per modificare il comportamento senza cambiare il contesto originale.

Ora raggiungiamo Activity

L' attività è una classe che estende ContextThemeWrapper che è una singola cosa focalizzata che l'utente può fare. Quasi tutte le attività interagiscono con l'utente, quindi la classe Activity si occupa di creare una finestra per te

Le Classi di seguito sono limitate all'estensione ma sono estese internamente dal loro discensore e forniscono supporto per specifiche API

Il SupportActivity è una classe che estende attività che è una classe di base per la composizione di funzionalità compatibilità insieme

Il BaseFragmentActivityApi14 è una classe che estende SupportActivity che è una classe di base è limitato classe ma si estendono da BaseFragmentActivityApi16 per supportare la funzionalità di V14

Il BaseFragmentActivityApi16 è una classe che estende BaseFragmentActivityApi14 che è una classe base per {@code FragmentActivity } per essere in grado di utilizzare V16 API. Ma è anche classe limitata ma è estesa da FragmentActivity per supportare la funzionalità di V16.

ora FragmentActivty

Il FragmentActivity è una classe che estende BaseFragmentActivityApi16 e che vuole utilizzare il frammento e Loader API supporto-based.

Quando si utilizza questa classe anziché il frammento integrato della nuova piattaforma e il supporto del caricatore, è necessario utilizzare rispettivamente i metodi getSupportFragmentManager()e getSupportLoaderManager()per accedere a tali funzionalità.

ActionBarActivity fa parte della libreria di supporto. Le librerie di supporto vengono utilizzate per fornire funzionalità più recenti su piattaforme meno recenti. Ad esempio, ActionBar è stato introdotto in API 11 e fa parte dell'attività per impostazione predefinita (a seconda del tema effettivamente). Al contrario, non c'è ActionBar sulle piattaforme meno recenti . Quindi la libreria di supporto aggiunge una classe figlio di attività ( ActionBarActivity ) che fornisce la funzionalità e l' interfaccia utente di ActionBar

Nel 2015 ActionBarActivity è obsoleto nella revisione 22.1.0 della libreria di supporto. In alternativa, è necessario utilizzare AppCompatActivity .

L'AppcompactActivity è una classe che estende FragmentActivity che è di classe di base per le attività che utilizzano la libreria di supporto caratteristiche barra delle operazioni.

Puoi aggiungere una ActionBar alla tua attività quando esegui a livello API 7 o superiore estendendo questa classe per la tua attività e impostando il tema dell'attività su Theme.AppCompato un tema simile

Qui

Mi riferisco a questi due uno , due


3

Poiché è probabile che il nome cambi nelle versioni future di Android (attualmente l'ultimo è, AppCompatActivityma probabilmente cambierà ad un certo punto), credo che una buona cosa avere sia una classe Activityche si estende AppCompatActivitye quindi tutte le tue attività si estendono da quella. Se domani, cambiano il nome in AppCompatActivity2ad esempio, dovrai cambiarlo in un solo posto.


0

AppCompatActivity estende FragmentActivity estende BaseFragmentActivityApi16 estende BaseFragmentActivityApi14 estende SupportActivity estende Attività

Quindi l' attività è più veloce di tutte e AppCompatActivity è il migliore di tutti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.