Activity, AppCompatActivity, FragmentActivity et ActionBarActivity: quand utiliser lequel?

266

Je viens d'iOS où c'est facile et vous utilisez simplement un UIViewController. Cependant, dans Android, les choses semblent beaucoup plus compliquées, avec certains composants UIC pour des niveaux d'API spécifiques. Je lis BigNerdRanch pour Android (le livre a environ 2 ans) et ils suggèrent que j'utilise Activitypour héberger mon FragmentActivities. Cependant, je pensais que Activityc'était obsolète.

Donc, pour l'API de niveau 22 (avec un support minimum pour l'API de niveau 15 ou 16), que dois-je exactement utiliser à la fois pour héberger les composants et pour les composants eux-mêmes? Y a-t-il des utilisations pour tous ces éléments ou devrais-je en utiliser un ou deux presque exclusivement?

Jameson
la source
1
Vous ne serez pas héberger FragmentActivityies. Vous hébergez uniquement Fragments. Sur les nouvelles versions d'Android, la Activityclasse elle-même a été mise à jour pour les héberger directement. Pour prendre en charge les anciennes versions a FragmentActivityété introduit.
Ravi Thapliyal du
5
De même, avec API 11+, la prise Activityen charge d'un ActionBar. Cela a été pris en charge sur les anciennes versions jusqu'à la ActionBarActivitypremière, qui est maintenant obsolète et remplacé par AppCompatActivity. Depuis, ces deux classes s'étendent, FragmentActivityelles prennent également en charge l'hébergement de Fragments.
Ravi Thapliyal

Réponses:

327

Je pensais que Activity était obsolète

Non.

Donc, pour l'API de niveau 22 (avec un support minimum pour l'API de niveau 15 ou 16), que dois-je exactement utiliser à la fois pour héberger les composants et pour les composants eux-mêmes? Y a-t-il des utilisations pour tous ces éléments ou devrais-je en utiliser un ou deux presque exclusivement?

Activityest la référence. Chaque activité hérite Activity, directement ou indirectement.

FragmentActivityest à utiliser avec le backport de fragments trouvés dans les bibliothèques support-v4et support-v13. L'implémentation native des fragments a été ajoutée dans l'API niveau 11, ce qui est inférieur aux minSdkVersionvaleurs proposées . La seule raison pour laquelle vous devriez considérer FragmentActivityspécifiquement est que vous souhaitez utiliser des fragments imbriqués (un fragment contenant un autre fragment), car cela n'était pas pris en charge dans les fragments natifs jusqu'au niveau 17 de l'API.

AppCompatActivity est du appcompat-v7 bibliothèque. Principalement, cela offre un backport de la barre d'action. Étant donné que la barre d'action native a été ajoutée dans l'API niveau 11, vous n'avez pas besoin AppCompatActivityde cela. Cependant, les versions actuelles appcompat-v7ajoutent également un backport limité de l'esthétique Material Design, en termes de barre d'action et de divers widgets. Il y a des avantages et des inconvénients à utiliser appcompat-v7, bien au-delà de la portée de cette réponse spécifique Stack Overflow.

ActionBarActivity est l'ancien nom de l'activité de base de appcompat-v7 . Pour diverses raisons, ils ont voulu changer le nom. À moins d' une bibliothèque tierce vous utilisez insiste sur une ActionBarActivity, vous devriez préférer AppCompatActivityplus ActionBarActivity.

Donc, étant donné votre minSdkVersiondans la gamme 15-16:

  • Si vous voulez le look Material Design rétroporté, utilisez AppCompatActivity

  • Sinon, mais vous voulez des fragments imbriqués, utilisez FragmentActivity

  • Sinon, utilisez Activity

Il suffit d'ajouter à partir du commentaire comme note: AppCompatActivityétend FragmentActivity, donc toute personne qui a besoin d'utiliser les fonctionnalités de FragmentActivitypeut utiliser AppCompatActivity.

CommonsWare
la source
Que se passe-t-il si je souhaite utiliser l'aspect Material Design et que je souhaite également des fragments imbriqués? AppCompatActivity hérite-t-il de FragmentActivity?
Orcun Sevsay
4
@MiloRambaldi: Oui, FragmentActivityest un ancêtre de AppCompatActivity. Bien que je ne recommande pas d'utiliser des fragments imbriqués, dans la mesure où les fragments imbriqués fonctionnent, ils AppCompatActivityprendront en charge les fragments imbriqués.
CommonsWare
Merci pour la réponse détaillée @CommonsWare. Pourriez-vous dire quel minSDK permettrait d'utiliser simplement la Activityplupart des dernières versions sans la support-v7conception de matériaux non rétroportée. Mon objectif est min 19, objectif 25
jugutier
1
@jugutier: Pour utiliser Theme.Material, vous avez besoin minSdkVersionde 21 ou plus.
CommonsWare
83

Activityest la classe de base de toutes les autres activités, je ne pense pas qu'elle sera dépréciée. La relation entre eux est:

Activity<- FragmentActivity<-AppCompatActivity <-ActionBarActivity

'<-' signifie héritage ici. La référence mentionnée ActionBarActivityest obsolète, utilisezAppCompatActivity plutôt.

Donc, en gros, utiliser AppCompatActivityest toujours le bon choix. Les différences entre eux sont:

  • Activity est la base.
  • Basé sur Activity, FragmentActivityoffre la possibilité d'utiliserFragment .
  • Basé sur FragmentActivity, AppCompatActivityfournit des fonctionnalités ActionBar.
Ted Yu
la source
2
réponse élégante.
M.kazem Akhgary
69

2019: Utilisation AppCompatActivity

Au moment d'écrire ces lignes (vérifiez le lien pour confirmer qu'il est toujours vrai), la documentation Android recommande d'utiliser AppCompatActivitysi vous utilisez une barre d'applications.

C'est le rationnel donné:

À partir d'Android 3.0 (API niveau 11), toutes les activités qui utilisent le thème par défaut ont un ActionBar comme barre d'application. Cependant, les fonctionnalités de la barre d'application ont été progressivement ajoutées à l'ActionBar native sur différentes versions d'Android. Par conséquent, l'ActionBar natif se comporte différemment selon la version du système Android qu'un appareil peut utiliser. En revanche, les fonctionnalités les plus récentes sont ajoutées à la version de la barre d'outils de la bibliothèque de support, et elles sont disponibles sur n'importe quel appareil pouvant utiliser la bibliothèque de support.

Pour cette raison, vous devez utiliser la classe Toolbar de la bibliothèque de support pour implémenter les barres d'application de vos activités. L'utilisation de la barre d'outils de la bibliothèque de support permet de garantir que votre application aura un comportement cohérent sur la plus large gamme d'appareils. Par exemple, le widget Barre d'outils fournit une expérience de conception de matériel sur les appareils exécutant Android 2.1 (API niveau 7) ou version ultérieure, mais la barre d'action native ne prend pas en charge la conception de matériau, sauf si l'appareil exécute Android 5.0 (API niveau 21) ou version ultérieure.

Les instructions générales pour ajouter une barre d'outils sont

  1. Ajouter la bibliothèque de support compatible v7 app
  2. Faites étendre toutes vos activités AppCompatActivity
  3. Dans le manifeste, déclarez que vous voulez NoActionBar.
  4. Ajoutez un ToolBarà la disposition xml de chaque activité.
  5. Obtenez le ToolBardans chaque activité onCreate.

Voir les instructions de documentation pour plus de détails. Ils sont assez clairs et utiles.

Suragch
la source
Salut @Suragch, merci pour cela. Supposons que je crée une application aujourd'hui qui ne prend en charge que 21 versions. En effet, comme cela arrive, je ne veux plus jamais d'une barre d'action ou d'une barre d'application (plus d'une application plein écran). Studio suggère (16 novembre) que je pourrais utiliser la "compatibilité descendante (AppCompat)" . Mon instinct est de ne PAS utiliser AppCompat. Quelle est votre opinion d'expert? Je ne peux que vous remercier, merci.
Fattie
Je ne suis pas un expert, je ne peux donc pas vous donner d'avis d'expert, mais la documentation suggère de prendre en charge autant d'appareils que possible, c'est ce que je fais. J'utilise AppCompat avec toutes mes applications et cela a bien fonctionné jusqu'à présent. Je suppose que si vous ne voulez vraiment pas prendre en charge la pré 21, vous pouvez ignorer la suggestion de Studio.
Suragch
50

Pour un niveau d'API minimum de 15, vous souhaitez utiliser AppCompatActivity. Ainsi, par exemple, votre MainActivityressemblerait à ceci:

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

Pour utiliser le AppCompatActivity, assurez-vous que la bibliothèque d'assistance Google est téléchargée (vous pouvez le vérifier dans vos Outils -> Android -> Gestionnaire de SDK). Ensuite, incluez simplement la dépendance gradle dans le fichier gradle.build de votre application:

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

Vous pouvez l'utiliser AppCompatcomme votre principal Activity, qui peut ensuite être utilisé pour lancer des fragments ou d'autres activités (cela dépend du type d'application que vous créez).

Le livre BigNerdRanch est une bonne ressource, mais oui, il est dépassé. Lisez-le pour des informations générales sur le fonctionnement d'Android, mais ne vous attendez pas à ce que les classes spécifiques qu'ils utilisent soient à jour.

adao7000
la source
OK, j'ai cette dépendance dans mon fichier gradle.build. Ainsi, par exemple, si je crée un tableau avec un tas de lignes (comme toute application Notes), mon écran principal sera un AppCompat et aussi tout ce qui héberge sera également un AppCompat? Dois-je simplement utiliser AppCompat?
Jameson
Votre AppCompat va donc gonfler une ressource de mise en page qui spécifie la conception (tableau avec un tas de lignes). Mais disons que vous souhaitez ouvrir une nouvelle page lorsque vous cliquez sur une ligne. Vous pouvez définir un onClickListener pour ouvrir une nouvelle activité AppCompat ou un fragment.
adao7000
Depuis le 3 août, BigNerdRanch a une nouvelle édition de son livre: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410
1
@ adao7000 mate où il a mentionné que pour 15 ans ou plus, vous pouvez utiliser AppCompatActivity - je pensais que la v7 dans android.support.v7.app est pour le minimum sdk requis est 7.
code
1
@codebased android.support.v7 peut être utilisé démarré au niveau d'API 9. Source: developer.android.com/topic/libraries/support-library/…
adao7000
30

Activityclasse est la classe de base. (L'original) Il prend en charge la gestion des fragments (depuis l'API 11). N'est plus recommandé son utilisation pure car ses spécialisations sont bien meilleures.

ActionBarActivityétait en un instant le remplacement de la classe Activity car il facilitait la gestion de l'ActionBar dans une application.

AppCompatActivityest la nouvelle façon de procéder, car l'ActionBar n'est plus encouragée et vous devez utiliser la barre d'outils à la place (c'est actuellement le remplacement de l' ActionBar). AppCompatActivity hérite de FragmentActivity, donc si vous avez besoin de gérer des fragments, vous pouvez (via le Fragment Manager). AppCompatActivity est pour N'IMPORTE QUELLE API, pas seulement 16+ (qui a dit cela?). Vous pouvez l'utiliser en ajoutant compile 'com.android.support:appcompat-v7:24:2.0'dans votre fichier Gradle. Je l'utilise dans API 10 et cela fonctionne parfaitement.

Joaquin Iurchuk
la source
1
"l'ActionBar est désormais obsolète" - la barre d'actions n'est pas obsolète. "vous devez utiliser la barre d'outils à la place" - les applications n'ont pas besoin d'utiliser Toolbar.
CommonsWare
@CommonsWare Ok, ce n'est pas obsolète mais son utilisation n'est plus encouragée dans sa forme la plus pure (l'ancienne). Maintenant, si vous souhaitez avoir une barre d'action dans votre application, vous devez l'ajouter manuellement à l'aide d'une barre d'outils.
Joaquin Iurchuk
"son utilisation n'est plus encouragée dans sa forme la plus pure" - je n'ai rien vu dans la documentation ou les articles officiels du blog qui justifieraient votre affirmation. avez vous un lien?
CommonsWare
@CommonsWare Vous êtes l'éminence ici et vous avez raison. Seules les directives de conception de matériaux suggèrent l'utilisation d'une barre d'outils comme barre d'action. Je devrais peut-être supprimer ma réponse car elle n'est pas précise. Merci
Joaquin Iurchuk
2
À partir de la bibliothèque de support version 26.0.0 (publiée en juillet 2017), le niveau d'API minimum pris en charge est passé à Android 4.0 (niveau d'API 14) pour tous les packages de bibliothèque de support. source: developer.android.com/topic/libraries/support-library/…
Andrea Leganza
12

Il y a beaucoup de confusion ici, surtout si vous lisez des sources obsolètes.

Le plus simple est celui Activityqui peut afficher des fragments. Vous pouvez utiliser cette combinaison si vous êtes sur la version Android> 4.

Cependant, il y a aussi une bibliothèque de soutien qui englobe les autres classes que vous avez mentionnés: FragmentActivity, ActionBarActivityet AppCompat. À l'origine, ils étaient utilisés pour prendre en charge des fragments sur les versions Android <4, mais en fait, ils sont également utilisés pour rétroporter les fonctionnalités des versions plus récentes d'Android (conception de matériaux par exemple).

Le dernier est AppCompat, les 2 autres sont plus anciens. La stratégie que j'utilise est de toujours utiliser AppCompat, afin que l'application soit prête en cas de rétroportages des futures versions d'Android.

fleur_vert
la source
Je vous remercie! OK, donc je peux utiliser AppCompat à la place de l'activité afin d'héberger ... quoi? Afin d'héberger d'autres AppCompats? Ou pour héberger FragmentActivities?
Jameson
Une activité n'héberge normalement que d'autres fragments ... Et ne vous inquiétez pas pour FragmentActivity, c'est plutôt une classe "de base", dont dérivent toutes les autres fantaisies XXXActivity.
Mehdi
Mais quelle classe mon hôte AppCompat devrait-il? Un autre AppCompat, ou autre chose?
Jameson
Vous n'avez qu'une chose à comprendre ici: les activités hébergent des fragments. Soit dit en passant, les activités ne sont hébergées par rien d'autre, elles ne peuvent pas être imbriquées. Appcompat n'est qu'un autre type d'activité. Après cela, vous pouvez continuer et imbriquer des fragments, mais cela commence à être complexe à gérer.
flower_green
1
Non, vous utilisez appcompat comme activité et vous hébergez des fragments, pas des activités de fragment.
flower_green
7

Si vous parlez Activity, AppcompactActivity, ActionBarActivityetc etc ..

Nous devons parler des classes de base qu'elles étendent, nous devons d'abord comprendre la hiérarchie des super classes.

Tout est démarré à partir de Context qui est super classe pour toutes ces classes.

Le contexte est une classe abstraite dont l'implémentation est fournie par le système Android. Il permet d'accéder à des ressources et des classes spécifiques à l'application, ainsi qu'à des appels ascendants pour des opérations au niveau de l'application telles que le lancement d'activités, la diffusion et la réception d'intentions, etc.

Context est suivi ou prolongé par ContextWrapper

Le ContextWrapper est une classe qui étend contexte classe simplement les délégués de tous ses appels vers un autre contexte. Peut être sous-classé pour modifier le comportement sans changer le contexte d'origine.

Maintenant, nous atteignons Activity

L' activité est une classe qui étend ContextThemeWrapper qui est une chose unique et ciblée que l'utilisateur peut faire. Presque toutes les activités interagissent avec l'utilisateur, donc la classe Activity se charge de créer une fenêtre pour vous

Les classes ci-dessous sont limitées à étendre mais elles sont étendues par leur descendeur en interne et fournissent un support pour Api spécifique

Le SupportActivity est une classe qui étend l' activité qui est une classe de base pour composer ensemble des fonctionnalités de compatibilité

Le BaseFragmentActivityApi14 est une classe qui étend SupportActivity qui est une classe de base Il est classe restreinte mais elle est prolongée pour BaseFragmentActivityApi16 pour soutenir la fonctionnalité de V14

Le BaseFragmentActivityApi16 est une classe qui étend BaseFragmentActivityApi14 qui est une classe de base pour {@code FragmentActivity } pour pouvoir utiliser v16 API. Mais c'est aussi une classe restreinte mais elle est étendue par FragmentActivity pour prendre en charge la fonctionnalité de V16.

maintenant FragmentActivty

Le FragmentActivity est une classe qui étend BaseFragmentActivityApi16 et qui veut utiliser le Fragment fondé sur le soutien et les API Loader.

Lorsque vous utilisez cette classe par opposition à la prise en charge des fragments et des chargeurs intégrés de la nouvelle plate-forme, vous devez utiliser les méthodes getSupportFragmentManager()et getSupportLoaderManager()respectivement pour accéder à ces fonctionnalités.

ActionBarActivity fait partie de la bibliothèque de support. Les bibliothèques de support sont utilisées pour proposer de nouvelles fonctionnalités sur les anciennes plates-formes. Par exemple, l' ActionBar a été introduit dans l'API 11 et fait partie de l'activité par défaut (en fonction du thème en fait). En revanche, il n'y a pas d' ActionBar sur les anciennes plates-formes. La bibliothèque de support ajoute donc une classe enfant d'activité ( ActionBarActivity ) qui fournit les fonctionnalités et l' interface utilisateur d'ActionBar

En 2015, ActionBarActivity est obsolète dans la révision 22.1.0 de la bibliothèque de support. AppCompatActivity doit être utilisé à la place.

Le AppcompactActivity est une classe qui étend FragmentActivity qui est la classe de base pour les activités qui utilisent les actions bibliothèque de fonctions support de bar.

Vous pouvez ajouter un ActionBar à votre activité lorsque vous exécutez sur l'API niveau 7 ou supérieur en étendant cette classe pour votre activité et en définissant le thème de l'activité sur Theme.AppCompatou un thème similaire

Ici

Je réfère ces deux un , deux

Farhana
la source
3

Étant donné que le nom est susceptible de changer dans les futures versions d'Android (actuellement la dernière est AppCompatActivitymais elle changera probablement à un moment donné), je crois qu'une bonne chose à avoir est une classe Activityqui s'étend AppCompatActivityet ensuite toutes vos activités s'étendent à partir de celle-ci. Si demain, ils changent le nom AppCompatActivity2par exemple, vous devrez le changer juste au même endroit.

Cher
la source
0

AppCompatActivity étend FragmentActivity étend BaseFragmentActivityApi16 étend BaseFragmentActivityApi14 étend SupportActivity étend l' activité

Ainsi, l' activité est plus rapide que tous et AppCompatActivity est le meilleur de tous.

Ahamadullah Saikat
la source