Actividad, AppCompatActivity, FragmentActivity y ActionBarActivity: ¿Cuándo usar cuál?
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 UIComponents para niveles API específicos. Estoy leyendo BigNerdRanch para Android (el libro tiene aproximadamente 2 años) y me sugieren que lo use Activity
para alojar mi archivo FragmentActivities
. Sin embargo, pensé Activity
que estaba en desuso.
Entonces, para el nivel API 22 (con un soporte mínimo para el nivel API 15 o 16), ¿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?
Pensé que la actividad estaba obsoleta.
No.
Entonces, para el nivel API 22 (con un soporte mínimo para el nivel API 15 o 16), ¿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?
Activity
es la línea de base. Toda actividad hereda de Activity
, directa o indirectamente.
FragmentActivity
se utiliza con el backport de fragmentos que se encuentran en las bibliotecas support-v4
y support-v13
. La implementación nativa de fragmentos se agregó en el nivel 11 de API, que es inferior a los valores propuestos minSdkVersion
. La única razón por la que debería considerarlo FragmentActivity
específicamente es si desea utilizar fragmentos anidados (un fragmento que contiene otro fragmento), ya que eso no era compatible con los fragmentos nativos hasta el nivel 17 de API.
AppCompatActivity
es de la appcompat-v7
biblioteca. Principalmente, esto ofrece un backport de la barra de acciones. Dado que la barra de acciones nativa se agregó en el nivel 11 de API, no es necesario AppCompatActivity
. Sin embargo, las versiones actuales appcompat-v7
también agregan un backport limitado de la estética de Material Design, en términos de la barra de acciones y varios widgets. Existen ventajas y desventajas de usar appcompat-v7
, que van mucho más allá del alcance de esta respuesta específica de Stack Overflow.
ActionBarActivity
es el nombre antiguo de la actividad base de appcompat-v7
. Por diversos motivos quisieron cambiar el nombre. A menos que alguna biblioteca de terceros que esté utilizando insista en un archivo ActionBarActivity
, debería preferirlo AppCompatActivity
a uno ActionBarActivity
.
Entonces, dado que estás minSdkVersion
en el rango de 15 a 16 años:
Si desea el aspecto de Material Design respaldado, use
AppCompatActivity
Si no, pero quieres fragmentos anidados, usa
FragmentActivity
Si no, usa
Activity
Simplemente agrego desde el comentario como nota: AppCompatActivity
se extiende FragmentActivity
, para que cualquiera que necesite usar funciones de FragmentActivity
pueda usarlas AppCompatActivity
.
Activity
es la clase base de todas las demás actividades, no creo que quede obsoleta. La relación entre ellos es:
Activity
<- FragmentActivity
<- AppCompatActivity
<-ActionBarActivity
'<-' significa herencia aquí. La referencia dicha ActionBarActivity
está en desuso, úsela AppCompatActivity
en su lugar.
Básicamente, usar AppCompatActivity
es siempre la elección correcta. Las diferencias entre ellos son:
Activity
es el básico.- Basado en
Activity
,FragmentActivity
proporciona la posibilidad de utilizarFragment
. - Basado en
FragmentActivity
,AppCompatActivity
proporciona funciones paraActionBar
.
2019: usoAppCompatActivity
En el momento de escribir este artículo (consulte el enlace para confirmar que sigue siendo cierto), la documentación de Android recomienda su uso AppCompatActivity
si está utilizando una barra de aplicaciones.
Este es el dado racional:
A partir de Android 3.0 (nivel de API 11), todas las actividades que utilizan el tema predeterminado tienen una ActionBar como barra de aplicaciones. Sin embargo, las funciones de la barra de aplicaciones se han agregado gradualmente a la ActionBar nativa en varias versiones de Android. Como resultado, la ActionBar 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 este motivo, debes utilizar la clase Toolbar de la biblioteca de soporte para implementar las barras de aplicaciones de tus actividades. El uso de la barra de herramientas de la biblioteca de soporte ayuda a garantizar que su aplicación tenga un comportamiento consistente en la más amplia gama de dispositivos. Por ejemplo, el widget de la barra de herramientas proporciona una experiencia de diseño de materiales en dispositivos que ejecutan Android 2.1 (nivel de API 7) o posterior, pero la barra de acciones nativa no admite diseño de materiales a menos que el dispositivo ejecute Android 5.0 (nivel de API 21) o posterior.
Las instrucciones generales para agregar una barra de herramientas son
- Agregue la biblioteca de soporte de appcompat v7
- Haz que todas tus actividades se extiendan
AppCompatActivity
- En el Manifiesto declara que quieres
NoActionBar
. - Agregue un
ToolBar
al diseño xml de cada actividad. - Obtenga el
ToolBar
en cada actividadonCreate
.
Consulte las instrucciones de la documentación para obtener más detalles. Son bastante claros y útiles.
Para un nivel mínimo de API de 15, querrás usar AppCompatActivity
. Así, por ejemplo, tu MainActivity
aspecto sería este:
public class MainActivity extends AppCompatActivity {
....
....
}
Para usar AppCompatActivity
, asegúrese de tener descargada la Biblioteca de soporte de Google (puede verificar esto en Herramientas -> Android -> Administrador de SDK). Luego simplemente 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 AppCompat
como su archivo principal Activity
, que luego puede usarse 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éelo para obtener información general sobre cómo funciona Android, pero no esperes que las clases específicas que utilizan estén actualizadas.