Activity, AppCompatActivity, FragmentActivity e ActionBarActivity: quando usar quais?

266

Eu sou do iOS, onde é fácil e você simplesmente usa um UIViewController. No entanto, no Android, as coisas parecem muito mais complicadas, com determinados UIComponents para níveis de API específicos. Estou lendo o BigNerdRanch para Android (o livro tem aproximadamente 2 anos) e eles sugerem que eu useActivity para hospedar o meu FragmentActivities. No entanto, pensei que Activityestava obsoleto.

Portanto, para o nível 22 da API (com um suporte mínimo para o nível 15 ou 16), o que exatamente devo usar para hospedar os componentes e os próprios componentes? Existem usos para todos esses itens ou devo usar um ou dois quase exclusivamente?

Jameson
fonte
1
Você não estará hospedando FragmentActivitys. Você hospeda apenas Fragments. Nas versões mais recentes do Android, a Activityprópria classe foi atualizada para hospedá-los diretamente. Para suportar versões mais antigas FragmentActivityfoi introduzido.
Ravi Thapliyal
5
Da mesma forma, com API 11+, Activityhavia suporte para um ActionBar. Isso foi suportado em versões mais antigas pela ActionBarActivityprimeira vez, que agora foi preterido e substituído por AppCompatActivity. Como ambas as classes se estendem, FragmentActivitytambém oferecem suporte a hospedagem Fragment.
Ravi Thapliyal

Respostas:

327

Achei que a atividade estava obsoleta

Não.

Portanto, para o nível 22 da API (com um suporte mínimo para o nível 15 ou 16), o que exatamente devo usar para hospedar os componentes e os próprios componentes? Existem usos para todos esses itens ou devo usar um ou dois quase exclusivamente?

Activityé a linha de base. Toda atividade herda Activity, direta ou indiretamente.

FragmentActivityé para uso com o backport de fragmentos encontrados nas bibliotecas support-v4e support-v13. A implementação nativa de fragmentos foi adicionada no nível 11 da API, que é menor que os minSdkVersionvalores propostos . A única razão pela qual você precisaria considerar FragmentActivityespecificamente é se você deseja usar fragmentos aninhados (um fragmento contendo outro fragmento), pois isso não era suportado em fragmentos nativos até o Nível 17 da API.

AppCompatActivityé da appcompat-v7biblioteca. Principalmente, isso oferece um backport da barra de ação. Como a barra de ação nativa foi adicionada no nível 11 da API, você não precisa AppCompatActivitydisso. No entanto, as versões atuais appcompat-v7também adicionam um backport limitado da estética do Material Design, em termos da barra de ação e de vários widgets. Existem prós e contras do uso appcompat-v7, muito além do escopo desta resposta específica do Stack Overflow.

ActionBarActivityé o nome antigo da atividade base de appcompat-v7. Por várias razões, eles queriam mudar o nome. A menos que alguma biblioteca de terceiros que você está usando insiste em um ActionBarActivity, você deve preferir AppCompatActivitymais ActionBarActivity.

Portanto, considerando o seu minSdkVersionintervalo entre 15 e 16:

  • Se você deseja uma aparência de Design de Material com backport, use AppCompatActivity

  • Caso contrário, mas você deseja fragmentos aninhados, use FragmentActivity

  • Caso contrário, use Activity

Apenas adicionando do comentário como nota: AppCompatActivityestende FragmentActivity, para que qualquer pessoa que precise usar os recursos do FragmentActivitypode usar AppCompatActivity.

CommonsWare
fonte
E se eu quiser usar a aparência do Design de materiais e também desejar fragmentos aninhados? AppCompatActivity herda de FragmentActivity?
Orcun Sevsay 17/11/2015
4
@MiloRambaldi: Sim, FragmentActivityé um ancestral de AppCompatActivity. Embora eu não recomende o uso de fragmentos aninhados, na medida em que os fragmentos aninhados funcionem, AppCompatActivityele oferecerá suporte a fragmentos aninhados.
CommonsWare
Obrigado pela resposta detalhada @CommonsWare. Você poderia dizer qual minSDK permitiria usar apenas Activitya maioria das novidades, sem, support-v7por exemplo, design de material não suportado. Meu objetivo é min 19 target 25
jugutier 17/02/2019
1
@jugutier: Para usar Theme.Material, você precisa minSdkVersionde 21 ou superior.
CommonsWare 17/02
83

Activityé a classe base de todas as outras atividades, não acho que será preterido. A relação entre eles é:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' significa herança aqui. A referência mencionada ActionBarActivityestá obsoleta, use em AppCompatActivityvez disso.

Então, basicamente, usar AppCompatActivityé sempre a escolha certa. As diferenças entre eles são:

  • Activity é o básico.
  • Com base em Activity, FragmentActivityfornece a capacidade de usar Fragment.
  • Com base em FragmentActivity, AppCompatActivityfornece recursos para ActionBar.
Ted Yu
fonte
2
resposta elegante.
M.kazem Akhgary 30/10
69

2019: Uso AppCompatActivity

No momento da redação deste texto (verifique o link para confirmar que ainda é verdade), a Documentação do Android recomenda o uso AppCompatActivityse você estiver usando uma Barra de Aplicativos.

Este é o racional dado:

A partir do Android 3.0 (API nível 11), todas as atividades que usam o tema padrão têm uma ActionBar como uma barra de aplicativos. No entanto, os recursos da barra de aplicativos foram gradualmente adicionados à ActionBar nativa em várias versões do Android. Como resultado, o ActionBar nativo se comporta de maneira diferente, dependendo da versão do sistema Android que um dispositivo pode estar usando. Por outro lado, os recursos mais recentes são adicionados à versão da barra de ferramentas da biblioteca de suporte e estão disponíveis em qualquer dispositivo que possa usar a biblioteca de suporte.

Por esse motivo, você deve usar a classe Barra de Ferramentas da biblioteca de suporte para implementar as barras de aplicativos das suas atividades. O uso da barra de ferramentas da biblioteca de suporte ajuda a garantir que seu aplicativo tenha um comportamento consistente na maior variedade de dispositivos. Por exemplo, o widget Barra de ferramentas fornece uma experiência de design de material em dispositivos com Android 2.1 (API nível 7) ou posterior, mas a barra de ação nativa não suporta design de material, a menos que o dispositivo esteja executando o Android 5.0 (API nível 21) ou posterior.

As instruções gerais para adicionar uma barra de ferramentas são

  1. Adicione a biblioteca de suporte v7 appcompat
  2. Amplie todas as suas atividades AppCompatActivity
  3. No manifesto, declare que deseja NoActionBar.
  4. Adicione um ToolBarao layout xml de cada atividade.
  5. Obter o ToolBarem cada atividade onCreate.

Consulte as instruções da documentação para obter mais detalhes. Eles são bastante claros e úteis.

Suragch
fonte
Olá @Suragch, obrigado por isso. Digamos que eu esteja criando um aplicativo hoje que APENAS suporte 21 em diante. De fato, por acaso eu não quero, nunca, uma barra de ação ou barra de aplicativos (mais um aplicativo em tela cheia). O Studio está sugerindo (16 de novembro) que eu possa usar "Compatibilidade com versões anteriores (AppCompat)" . Meu instinto é NÃO usar AppCompat. Qual a sua opinião de especialista? Só posso agradecer, obrigado.
Fattie
Como não sou especialista, não posso dar uma opinião de especialista, mas a documentação sugere oferecer suporte ao maior número de dispositivos possível, e é isso que faço. Eu uso o AppCompat com todos os meus aplicativos e funcionou bem até agora. Suponho que, se você realmente não deseja dar suporte à pré 21, pode ignorar a sugestão do Studio.
Suragch
50

Para um nível mínimo de API de 15, convém usar AppCompatActivity. Então, por exemplo, você MainActivityficaria assim:

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

Para usar o AppCompatActivity, verifique se você baixou a Biblioteca de suporte do Google (verifique isso em Ferramentas -> Android -> Gerenciador de SDK). Em seguida, inclua a dependência gradle no arquivo gradle.build do seu aplicativo:

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

Você pode usar isso AppCompatcomo principal Activity, que pode ser usado para iniciar fragmentos ou outras atividades (isso depende do tipo de aplicativo que você está criando).

O livro do BigNerdRanch é um bom recurso, mas sim, está desatualizado. Leia-o para obter informações gerais sobre como o Android funciona, mas não espere que as classes específicas que eles usam estejam atualizadas.

adao7000
fonte
OK, eu tenho essa dependência no meu arquivo gradle.build. Então, por exemplo, se estou criando uma tabela com várias linhas (como qualquer aplicativo do Notes), minha tela principal será um AppCompat e também qualquer outra coisa que os hosts também sejam um AppCompat? Basicamente, só preciso usar o AppCompat?
Jameson
Portanto, seu AppCompat aumentará algum recurso de layout que especifica o design (tabela com várias linhas). Mas digamos que você queira abrir uma nova página quando clicar em uma linha. Você pode definir um onClickListener para abrir uma nova atividade AppCompat ou um fragmento.
adao7000
A partir de 03 de agosto, BigNerdRanch tem uma nova edição do seu livro: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/...
bryant1410
1
@ companheiro adao7000 onde ele mencionou que para 15 ou acima, você pode usar AppCompatActivity - Pensei v7 em android.support.v7.app é para SDK mínimo exigido é de 7.
codebased
1
@codebased android.support.v7 pode ser usado começou a nível API 9. Fonte: developer.android.com/topic/libraries/support-library/...
adao7000
30

Activityclasse é a classe básica. (O original) Ele suporta gerenciamento de fragmentos (desde API 11). Não é mais recomendado seu uso puro, porque suas especializações são muito melhores.

ActionBarActivityfoi em um momento a substituição da classe Activity, porque facilitou o manuseio da ActionBar em um aplicativo.

AppCompatActivityé o novo caminho a seguir, porque o ActionBar não é mais incentivado e você deve usar a Barra de Ferramentas (que atualmente é a substituição do ActionBar). AppCompatActivity herda de FragmentActivity; portanto, se você precisar manipular fragmentos, é possível (via Gerenciador de fragmentos). AppCompatActivity é para QUALQUER API, não apenas para maiores de 16 anos (quem disse isso?). Você pode usá-lo adicionando compile 'com.android.support:appcompat-v7:24:2.0'no seu arquivo Gradle. Eu o uso na API 10 e funciona perfeitamente.

Joaquin Iurchuk
fonte
1
"a ActionBar agora está obsoleta" - a barra de ação não está obsoleta. "você precisa usar a Barra de Ferramentas" - os aplicativos não precisam ser usados Toolbar.
CommonsWare
@CommonsWare Ok, não é preterido, mas seu uso não é mais incentivado em sua forma mais pura (a antiga). Agora, se você quiser ter uma Barra de Ação no seu aplicativo , adicione-a manualmente usando uma Barra de Ferramentas.
Joaquin Iurchuk 08/07/2015
"seu uso não é mais incentivado em sua forma mais pura" - não vi nada na documentação ou nas postagens oficiais do blog que justificassem sua reivindicação. Você tem um link?
CommonsWare
@ CommmonsWare Você é a eminência aqui e está certa. Somente as diretrizes de design de materiais sugerem o uso de uma barra de ferramentas como uma barra de ação. Talvez eu deva excluir minha resposta, pois não é precisa. Obrigado
Joaquin Iurchuk
2
A partir da Biblioteca de suporte versão 26.0.0 (lançada em julho de 2017), o nível mínimo da API suportada foi alterado para Android 4.0 (API nível 14) para todos os pacotes da biblioteca de suporte. Fonte: developer.android.com/topic/libraries/support-library/…
Andrea Leganza
12

Há muita confusão aqui, especialmente se você ler fontes desatualizadas.

O básico é Activityque pode mostrar fragmentos. Você pode usar essa combinação se estiver na versão Android> 4.

No entanto, há também uma biblioteca de suporte que abrange as outras classes que você mencionou: FragmentActivity, ActionBarActivitye AppCompat. Originalmente, eles eram usados ​​para oferecer suporte a fragmentos nas versões do Android <4, mas na verdade também são usados ​​para suportar a funcionalidade de versões mais recentes do Android (design do material, por exemplo).

O mais recente é que AppCompatos outros 2 são mais antigos. A estratégia que eu uso é sempre usar AppCompat, para que o aplicativo esteja pronto em caso de backports de versões futuras do Android.

flower_green
fonte
Obrigado! OK, para que eu possa usar AppCompat no lugar de Activity para hospedar ... o quê? Para hospedar outros AppCompats? Ou para hospedar FragmentActivities?
Jameson
Uma atividade normalmente hospeda apenas outros fragmentos ... E não se preocupe com FragmentActivity, é mais uma classe "base", da qual derivam todas as outras fantasia XXXActivity.
Mehdi
Mas qual classe meu AppCompat deve hospedar? Outro AppCompat, ou algo mais?
Jameson
Você só precisa entender uma coisa aqui: as atividades hospedam fragmentos. A propósito, as atividades não são hospedadas por mais nada; elas não podem ser aninhadas. Appcompat é apenas outro tipo de atividade. Depois disso, você pode aninhar fragmentos, mas isso começa a ser complexo de gerenciar.
flower_green
1
Não, você usa appcompat como uma atividade e hospeda fragmentos, não atividades de fragmentação.
flower_green
7

Se você falar sobre Activity, AppcompactActivity, ActionBarActivityetc etc ..

Precisamos falar sobre as classes Base que elas estão estendendo. Primeiro, precisamos entender a hierarquia das super classes.

Todas as coisas são iniciadas no Contexto, que é uma super classe para todas essas classes.

O contexto é uma classe abstrata cuja implementação é fornecida pelo sistema Android. Permite acesso a recursos e classes específicos de aplicativos, bem como chamadas para operações no nível de aplicativos, como atividades de lançamento, transmissão e recebimento de intenções, etc.

Context é seguido ou estendido por ContextWrapper

O ContextWrapper é uma classe que estende a classe Context que simplesmente delega todas as suas chamadas para outro Contexto. Pode ser subclassificado para modificar o comportamento sem alterar o contexto original.

Agora chegamos a Activity

A Activity é uma classe que estende o ContextThemeWrapper, que é uma coisa única e focada que o usuário pode fazer. Quase todas as atividades interagem com o usuário, portanto, a classe Activity cuida da criação de uma janela para você

As Classes abaixo são restritas a estender, mas elas são estendidas internamente por seu descendente e fornecem suporte para APIs específicas

O SupportActivity é uma classe que se estende Actividade que é uma base de dados de classe para compor funcionalidade compatibilidade juntos

O BaseFragmentActivityApi14 é uma classe que estende SupportActivity que é uma classe Base. É uma classe restrita, mas é estendida por BaseFragmentActivityApi16 para suportar a funcionalidade do V14

A BaseFragmentActivityApi16 é uma classe que estende BaseFragmentActivityApi14 que é uma classe Base para {@code FragmentActivity } poder usar APIs v16 . Mas também é classe restrita, mas é estendida por FragmentActivity para suportar a funcionalidade da V16.

agora FragmentActivty

O FragmentActivity é uma classe que estende BaseFragmentActivityApi16 e deseja usar as APIs de Fragment and Loader baseadas em suporte.

Ao usar essa classe, em oposição ao suporte integrado ao fragmento e carregador da nova plataforma, você deve usar os métodos getSupportFragmentManager()e getSupportLoaderManager()respectivamente para acessar esses recursos.

ActionBarActivity faz parte da Biblioteca de suporte. As bibliotecas de suporte são usadas para fornecer recursos mais recentes em plataformas mais antigas. Por exemplo, o ActionBar foi introduzido na API 11 e faz parte da atividade por padrão (dependendo do tema realmente). Por outro lado, não há ActionBar nas plataformas mais antigas. Portanto, a biblioteca de suporte adiciona uma classe filho de Atividade ( ActionBarActivity ) que fornece a funcionalidade e a interface do usuário da ActionBar.

Em 2015, o ActionBarActivity foi descontinuado na revisão 22.1.0 da Biblioteca de suporte. AppCompatActivity deve ser usado.

O AppcompactActivity é uma classe que estende FragmentActivity que é a classe Base para atividades que usam os recursos da barra de ação da biblioteca de suporte.

Você pode adicionar um ActionBar à sua atividade ao executar na API nível 7 ou superior, estendendo esta classe para sua atividade e definindo o tema da atividade como Theme.AppCompatou um tema semelhante

Aqui

Refiro esses dois um , dois

Farhana
fonte
3

Como o nome provavelmente mudará em versões futuras do Android (atualmente a mais recente é, AppCompatActivitymas provavelmente mudará em algum momento), acredito que uma coisa boa a se ter é uma classe Activityque se estende AppCompatActivitye, em seguida, todas as suas atividades se estendem dessa. Se amanhã, eles mudarem o nome para, AppCompatActivity2por exemplo, você precisará alterá-lo apenas em um só lugar.

ExpensiveBelly
fonte
0

AppCompatActivity estende FragmentActivity estende BaseFragmentActivityApi16 estende BaseFragmentActivityApi14 estende SupportActivity estende atividade

Portanto, a atividade é mais rápida do que tudo e AppCompatActivity é o melhor de todos.

Ahamadullah Saikat
fonte