Activity, AppCompatActivity, FragmentActivity y ActionBarActivity: ¿Cuándo usar cuál?


266

Vengo de iOS donde es fácil y simplemente usas un UIViewController. Sin embargo, en Android las cosas parecen mucho más complicadas, con ciertos componentes de UIC para niveles de API específicos. Estoy leyendo BigNerdRanch para Android (el libro tiene aproximadamente 2 años) y sugieren que use Activitypara alojar mi FragmentActivities. Sin embargo, pensé que Activityestaba en desuso.

Entonces, para el nivel 22 de API (con un soporte mínimo para el nivel 15 o 16 de API), ¿qué debo usar exactamente para alojar los componentes y para los componentes mismos? ¿Hay usos para todos estos, o debería usar uno o dos casi exclusivamente?


1
No serás anfitrión de FragmentActivityies. Usted solo aloja Fragments. En las versiones más recientes de Android, la Activityclase en sí se ha actualizado para alojarlas directamente. Para admitir versiones anteriores FragmentActivityse introdujo.
Ravi Thapliyal

55
Del mismo modo, con API 11+, se Activityadmitió una ActionBar. Esto fue compatible con versiones anteriores hasta la ActionBarActivityprimera, que ahora ha quedado en desuso y reemplazado por AppCompatActivity. Dado que ambas clases se extienden, FragmentActivitytambién admiten Fragments de alojamiento .
Ravi Thapliyal

Respuestas:


327

Pensé que la actividad estaba en desuso

No.

Entonces, para el nivel 22 de API (con un soporte mínimo para el nivel 15 o 16 de API), ¿qué debo usar exactamente para alojar los componentes y para los componentes mismos? ¿Hay usos para todos estos, o debería usar uno o dos casi exclusivamente?

ActivityEs la línea de base. Toda actividad hereda Activity, directa o indirectamente.

FragmentActivityes para usar con el backport de fragmentos encontrados en las bibliotecas support-v4y support-v13. La implementación nativa de fragmentos se agregó en el Nivel de API 11, que es inferior a los minSdkVersionvalores propuestos . La única razón por la que debería considerar FragmentActivityespecíficamente es si desea usar fragmentos anidados (un fragmento que contiene otro fragmento), ya que eso no se admitió en fragmentos nativos hasta el nivel 17 de API.

AppCompatActivityEs de la appcompat-v7biblioteca. Principalmente, esto ofrece un backport de la barra de acción. Dado que la barra de acción nativa se agregó en el API Nivel 11, no es necesario AppCompatActivitypara eso. Sin embargo, las versiones actuales appcompat-v7también agregan un backport limitado de la estética de Material Design, en términos de la barra de acción y varios widgets. Hay ventajas y desventajas de usar appcompat-v7, mucho más allá del alcance de esta respuesta específica de desbordamiento de pila.

ActionBarActivityes el nombre antiguo de la actividad base de appcompat-v7. Por varias razones, querían cambiar el nombre. A menos que algún biblioteca de terceros que está utilizando insiste en una ActionBarActivity, se debe preferir AppCompatActivitymás ActionBarActivity.

Entonces, dado su minSdkVersionrango de 15-16:

  • Si desea el aspecto de diseño de material con soporte, use AppCompatActivity

  • Si no, pero desea fragmentos anidados, use FragmentActivity

  • Si no, use Activity

Simplemente agregando desde el comentario como nota: se AppCompatActivityextiende FragmentActivity, por lo que cualquiera que necesite usar funciones de FragmentActivitypuede usar AppCompatActivity.


¿Qué sucede si quiero usar el aspecto Diseño de materiales y también quiero fragmentos anidados? ¿AppCompatActivity hereda de FragmentActivity?
Orcun Sevsay

44
@MiloRambaldi: Sí, FragmentActivityes un antepasado de AppCompatActivity. Si bien no recomiendo usar fragmentos anidados, en la medida en que los fragmentos anidados funcionen, AppCompatActivityadmitirán fragmentos anidados.
CommonsWare

Gracias por la respuesta detallada @CommonsWare. ¿Podría decir qué minSDK permitiría usar la Activitymayor parte de lo último sin, por support-v7ejemplo, diseño de material no soportado? Mi objetivo es min 19 objetivo 25
jugutier

1
@jugutier: Para usar Theme.Material, necesitas minSdkVersion21 o más.
CommonsWare

83

Activityes la clase base de todas las demás actividades, no creo que sea obsoleto. La relación entre ellos es:

Activity<- FragmentActivity<- AppCompatActivity<-ActionBarActivity

'<-' significa herencia aquí. La referencia que se dice ActionBarActivityestá en desuso, úsela en su AppCompatActivitylugar.

Básicamente, usar AppCompatActivityes siempre la elección correcta. Las diferencias entre ellos son:

  • Activity Es el básico.
  • Basado en Activity, FragmentActivityproporciona la capacidad de uso Fragment.
  • Basado en FragmentActivity, AppCompatActivityproporciona características para ActionBar.

2
respuesta elegante
M.kazem Akhgary

69

2019: uso AppCompatActivity

En el momento de escribir esto (verifique el enlace para confirmar que todavía es cierto), la Documentación de Android recomienda usar AppCompatActivitysi está utilizando una barra de aplicaciones.

Este es el racional dado:

A partir de Android 3.0 (API nivel 11), todas las actividades que usan el tema predeterminado tienen una barra de acción como barra de aplicaciones. Sin embargo, las funciones de la barra de aplicaciones se han agregado gradualmente a la barra de acción nativa en varios lanzamientos de Android. Como resultado, la barra de acción nativa se comporta de manera diferente según la versión del sistema Android que pueda estar usando un dispositivo. Por el contrario, las funciones más recientes se agregan a la versión de la barra de herramientas de la biblioteca de soporte, y están disponibles en cualquier dispositivo que pueda usar la biblioteca de soporte.

Por esta razón, debe usar la clase de barra de herramientas de la biblioteca de soporte para implementar las barras de aplicaciones de sus actividades. El uso de la barra de herramientas de la biblioteca de soporte ayuda a garantizar que su aplicación tenga un comportamiento constante en la más amplia gama de dispositivos. Por ejemplo, el widget Toolbar proporciona una experiencia de diseño de material en dispositivos que ejecutan Android 2.1 (API nivel 7) o posterior, pero la barra de acción nativa no admite diseño de material a menos que el dispositivo ejecute Android 5.0 (API nivel 21) o posterior.

Las instrucciones generales para agregar una barra de herramientas son

  1. Agregue la biblioteca de soporte de v7 appcompat
  2. Haz que todas tus actividades se extiendan AppCompatActivity
  3. En el manifiesto declara que quieres NoActionBar.
  4. Agregue un ToolBardiseño xml de cada actividad.
  5. Obtenga el ToolBaren cada actividad onCreate.

Consulte las instrucciones de la documentación para más detalles. Son bastante claros y útiles.


Hola @Suragch, gracias por esto. Digamos que hoy estoy haciendo una aplicación que SOLO admite 21 en adelante. De hecho, resulta que no quiero, nunca, una barra de acción o una barra de aplicaciones (más de una aplicación de pantalla completa). Studio sugiere (16 de noviembre) que podría usar "Compatibilidad con versiones anteriores (AppCompat)" . Mi instinto es NO usar AppCompat. ¿Cuál es tu opinión experta? Solo puedo agradecerte, gracias.
Fattie

No soy un experto, así que no puedo darle una opinión experta, pero la documentación sugiere admitir tantos dispositivos como sea posible, así que eso es lo que hago. Utilizo AppCompat con todas mis aplicaciones y hasta ahora ha funcionado bien. Supongo que si realmente no quieres admitir pre 21, puedes ignorar la sugerencia de Studio.
Suragch

50

Para un nivel mínimo de API de 15, querrás usar AppCompatActivity. Entonces, por ejemplo, MainActivityse vería así:

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

Para usarlo AppCompatActivity, asegúrese de tener descargada la Biblioteca de soporte de Google (puede verificar esto en Herramientas -> Android -> Administrador de SDK). Luego solo incluya la dependencia de gradle en el archivo gradle.build de su aplicación:

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

Puede usar esto AppCompatcomo su principal Activity, que luego se puede usar para iniciar Fragmentos u otras Actividades (esto depende del tipo de aplicación que esté creando).

El libro BigNerdRanch es un buen recurso, pero sí, está desactualizado. Léalo para obtener información general sobre cómo funciona Android, pero no espere que las clases específicas que usan estén actualizadas.


OK, tengo esa dependencia en mi archivo gradle.build. Entonces, por ejemplo, si estoy haciendo una tabla con un montón de filas (como cualquier aplicación de Notes), mi pantalla principal será AppCompat y también cualquier otra cosa que los hosts también sean AppCompat. ¿Básicamente solo necesito usar AppCompat?
Jameson

Por lo tanto, su AppCompat inflará algún recurso de diseño que especifica el diseño (tabla con un montón de filas). Pero supongamos que desea abrir una nueva página cuando hace clic en una fila. Puede configurar un onClickListener para abrir una nueva Actividad de AppCompat o un Fragmento.
adao7000

A partir del 3 de agosto, BigNerdRanch tiene una nueva edición de su libro: amazon.com/Android-Programming-Nerd-Ranch-Guide/dp/0134171454/…
bryant1410

1
@ adao7000 mate donde ha mencionado que para 15 o más años puede usar AppCompatActivity - Pensé que v7 en android.support.v7.app es para un SDK mínimo requerido es 7.
basado en código

1
@codebased android.support.v7 se puede usar a partir del nivel de API 9. Fuente: developer.android.com/topic/libraries/support-library/…
adao7000

30

ActivityLa clase es la clase básica. (El original) Es compatible con la gestión de fragmentos (desde API 11). Ya no se recomienda su uso puro porque sus especializaciones son mucho mejores.

ActionBarActivityfue en un momento el reemplazo de la clase Actividad porque facilitó el manejo de ActionBar en una aplicación.

AppCompatActivityes la nueva forma de hacerlo porque ya no se recomienda la ActionBar y en su lugar deberías usar Toolbar (que actualmente es el reemplazo de ActionBar). AppCompatActivity hereda de FragmentActivity, por lo que si necesita manejar Fragmentos, puede hacerlo (a través del Administrador de Fragmentos). AppCompatActivity es para CUALQUIER API, no solo para mayores de 16 años (¿quién dijo eso?). Puede usarlo agregando compile 'com.android.support:appcompat-v7:24:2.0'su archivo Gradle. Lo uso en API 10 y funciona perfecto.


1
"la Barra de acciones ahora está en desuso": la barra de acciones no está en desuso. "En su lugar, debe usar la barra Google": no es necesario que las aplicaciones las usen Toolbar.
CommonsWare

@CommonsWare Ok, no está en desuso, pero ya no se recomienda su uso en su forma más pura (la anterior). Ahora, si desea tener una barra de acción en su aplicación , debe agregarla manualmente usando una barra de herramientas.
Joaquin Iurchuk

"ya no se recomienda su uso en su forma más pura": no he visto nada en la documentación o en las publicaciones oficiales del blog que justifiquen su reclamo. ¿Tienes un enlace?
CommonsWare

@CommonsWare Eres la eminencia aquí y tienes razón. Solo las pautas de diseño de materiales sugieren el uso de una barra de herramientas como barra de acción. Tal vez debería eliminar mi respuesta, ya que no es precisa. Gracias
Joaquin Iurchuk

2
A partir de la versión 26.0.0 de la biblioteca de soporte (lanzada en julio de 2017), el nivel mínimo de API admitido ha cambiado a Android 4.0 (nivel de API 14) para todos los paquetes de la biblioteca de soporte. fuente: developer.android.com/topic/libraries/support-library/…
Andrea Leganza

12

Aquí hay mucha confusión, especialmente si lees fuentes obsoletas.

El básico es Activity, que puede mostrar Fragmentos. Puede usar esta combinación si está en la versión de Android> 4.

Sin embargo, también hay una biblioteca de soporte que abarca las otras clases que usted ha mencionado: FragmentActivity, ActionBarActivityy AppCompat. Originalmente se usaban para admitir fragmentos en versiones de Android <4, pero en realidad también se usan para respaldar la funcionalidad de versiones más recientes de Android (diseño de materiales, por ejemplo).

El último es AppCompat, los otros 2 son mayores. La estrategia que uso es usar siempre AppCompat, para que la aplicación esté lista en caso de backports de futuras versiones de Android.


¡Gracias! OK, entonces puedo usar AppCompat en lugar de Activity para alojar ... ¿qué? ¿Para alojar otros AppCompats? ¿O para alojar FragmentActivities?
Jameson

Una actividad normalmente solo aloja otros fragmentos ... Y no te preocupes por FragmentActivity, es más una clase "base", de la que derivan todas las demás XXXActivity.
Mehdi

Pero, ¿qué clase debería alojar mi AppCompat? ¿Otra AppCompat o algo más?
Jameson

Aquí solo tiene una cosa que entender: las actividades alojan fragmentos. Por cierto, las actividades no están alojadas por ninguna otra cosa, no pueden anidarse. Appcompat es solo otro tipo de actividad. Después de eso, puede continuar y anidar fragmentos, pero eso comienza a ser complejo de manejar.
flower_green

1
No, utiliza appcompat como actividad y aloja fragmentos, no actividades de fragmentación.
flower_green

7

Si se habla de Activity, AppcompactActivity, ActionBarActivityetc, etc ..

Necesitamos hablar sobre las clases Base que están extendiendo. Primero tenemos que entender la jerarquía de las superclases.

Todas las cosas se inician desde Context, que es una superclase para todas estas clases.

El contexto es una clase abstracta cuya implementación es proporcionada por el sistema Android. Permite el acceso a recursos y clases específicos de la aplicación, así como llamadas para operaciones a nivel de aplicación, como actividades de lanzamiento, difusión y recepción de intenciones, etc.

Context es seguido o extendido por ContextWrapper

El ContextWrapper es una clase que se extienden Contexto clase que simplemente delegados de todas sus llamadas a otro contexto. Se puede subclasificar para modificar el comportamiento sin cambiar el contexto original.

Ahora llegamos a Activity

La actividad es una clase que extiende ContextThemeWrapper que es una cosa única y enfocada que el usuario puede hacer. Casi todas las actividades interactúan con el usuario, por lo que la clase Actividad se encarga de crear una ventana para usted.

Las clases a continuación están restringidas para extenderse, pero su descendente las extiende internamente y brindan soporte para Api específicas

El SupportActivity es una clase que se extiende actividad que es una clase base para la composición de la funcionalidad de compatibilidad junto

El BaseFragmentActivityApi14 es una clase que se extiende SupportActivity que es una clase base Se limita clase pero se extienden por BaseFragmentActivityApi16 para apoyar la funcionalidad de V14

El BaseFragmentActivityApi16 es una clase que se extiende BaseFragmentActivityApi14 que es una clase base para {@code FragmentActivity } para ser capaz de utilizar V16 APIs. Pero también es una clase restringida, pero FragmentActivity la extiende para admitir la funcionalidad de V16.

ahora FragmentActivty

El FragmentActivity es una clase que se extiende BaseFragmentActivityApi16 y que quiere usar el basado en el apoyo Fragmento del cargador y APIs.

Al usar esta clase en lugar de la compatibilidad con el cargador y los fragmentos integrados de la nueva plataforma, debe usar los métodos getSupportFragmentManager()y getSupportLoaderManager()respectivamente para acceder a esas funciones.

ActionBarActivity es parte de la Biblioteca de soporte. Las bibliotecas de soporte se utilizan para ofrecer nuevas funciones en plataformas más antiguas. Por ejemplo, ActionBar se introdujo en API 11 y forma parte de la Actividad de forma predeterminada (dependiendo del tema en realidad). Por el contrario, no hay ActionBar en las plataformas más antiguas. Por lo tanto, la biblioteca de soporte agrega una clase secundaria de Actividad ( ActionBarActivity ) que proporciona la funcionalidad y la interfaz de usuario de ActionBar

En 2015, ActionBarActivity está en desuso en la revisión 22.1.0 de la Biblioteca de soporte. AppCompatActivity debería usarse en su lugar.

El AppcompactActivity es una clase que se extiende FragmentActivity que es la clase base para las actividades que utilizan la biblioteca de soporte características de la barra de acción.

Puede agregar una barra de acción a su actividad cuando se ejecuta en el nivel de API 7 o superior extendiendo esta clase para su actividad y configurando el tema de actividad a Theme.AppCompatun tema similar

aquí

Me refiero a estos dos uno , dos


3

Dado que es probable que el nombre cambie en futuras versiones de Android (actualmente la última es, AppCompatActivitypero probablemente cambiará en algún momento), creo que es bueno tener una clase Activityque se extienda AppCompatActivityy luego todas sus actividades se extenderán desde esa. Si mañana cambian el nombre, AppCompatActivity2por ejemplo, tendrá que cambiarlo en un solo lugar.


0

AppCompatActivity extiende FragmentActivity extiende BaseFragmentActivityApi16 extiende BaseFragmentActivityApi14 extiende SupportActivity extiende Actividad

Entonces, Activity es más rápido que todos y AppCompatActivity es lo mejor de todo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.