Diferencia entre revisiones de «PDM Activities»

De MediaWiki
Ir a la navegación Ir a la búsqueda
 
(No se muestran 29 ediciones intermedias de otro usuario)
Línea 12: Línea 12:
  
  
* Crea un novo proxecto de nome '''U2_01_CreandoActivities'''.
 
::* MinSDK: 19
 
::* Target_SDK: 27
 
::* Compile_SDK: 27
 
  
[[Imagen:PDM_Activity_0.jpg|500px|center]]
+
'''Preparación previa:'''
 +
* Partimos que xa temos creado o proxecto inicial como [https://wiki.cifprodolfoucha.es/index.php?title=PDM_UD1_Co%C3%B1ecendoAndroidStudio#Creando_un_proxecto_Base xa indicamos anteriormente].
 +
: Se non o temos creado antes, crea un paquete de nome '''UD2''' e dentro deste outro paquete de nome '''Activities'''.
 +
[[Imagen:PDM_Activity_0A.jpg|350px|center]]
 +
 
 +
: Vos debe quedar como na imaxe anterior. Indicar que fisicamente temos creados os cartafoles UD2/Activities pero como non existen clases no cartafol UD2/ Android Studio o oculta.
 +
<br />
 +
 
 +
=Creando Activities=
 +
 
 +
* En Android existen moitos tipos de 'Activities'.
 +
: Todas elas teñen en común que son ventás onde se van 'debuxar' elementos da interface do usuario.
 +
 
 +
* Neste punto imos centrarnos en dous tipos de activity:
 +
:* [https://developer.android.com/reference/android/app/Activity?hl=en Activity]
 +
:: Son activities clásicas onde o usuario van interaccionar con compoñentes gráficos.
 +
 
 +
:* [https://developer.android.com/reference/androidx/appcompat/app/AppCompatActivity AppCompatActivity]
 +
:: Son activities que derivan de Activity e que se atopan dentro da librería de compatibilidade v7.
 +
:: Teñen a mesma función que as de clase Activity (servir como pantallas para interaccionar con compoñentes gráficos). Inicialmente foron creadas para que se puidera empregar o AppBar en versións de Android anteriores a que aparecera.
 +
:: Existen novas funcionalidades que van poder ser empregadas en versións Android anteriores a que apareceran grazas o uso desta clase [https://wiki.cifprodolfoucha.es/index.php?title=PDM_UD1_Bibliotecas_de_compatibilidade como xa vimos anteriormente nesta Wiki].
 +
 +
:: Na versión actual de Android Studio (Sept.2019) xa crea por defecto as activities desta clase.
  
  
  
<br />
 
=Creando Activities=
 
  
 
* Cada vez que se crea unha activity, aparece unha nova entrada no arquivo '''AndroidManifiest.xml'''.
 
* Cada vez que se crea unha activity, aparece unha nova entrada no arquivo '''AndroidManifiest.xml'''.
 
: Vexamos un exemplo, e crearemos unha nova activity no asistente:
 
: Vexamos un exemplo, e crearemos unha nova activity no asistente:
<gallery caption="Creando unha nova activity" widths="350" heights="300px" perrow="2">
+
<gallery caption="Creando unha nova activity no paquete UD2.Activities" widths="350" heights="300px" perrow="2">
 
Image:PDM_Activity_1.jpg| Creamos unha 'Empty Activity'. Podemos crear diferentes activities cunha serie de compoñentes gráficas xa engadidas previamente e así aforrarnos traballo.
 
Image:PDM_Activity_1.jpg| Creamos unha 'Empty Activity'. Podemos crear diferentes activities cunha serie de compoñentes gráficas xa engadidas previamente e así aforrarnos traballo.
Image:PDM_Activity_2.jpg| Non marcamos nin a opción de que poda ser lanzada nin a biblioteca de compatibilidade.
+
Image:PDM_Activity_2.jpg| '''Non marcamos a opción de que poda ser lanzada''' (Launcher Activity).  
Image:PDM_Activity_3.jpg| Como vemos no arquivo de AndroidManifiest.xml se crea unha nova entrada para a activity creada. Antepón un punto xa que Android para lanzar a activity fai uso do identificar completo formado polo nome do paquete e o nome da activity.
+
Image:PDM_Activity_3.jpg| Como vemos no arquivo de AndroidManifiest.xml se crea unha nova entrada para a activity creada. Antepón un punto xa que Android para lanzar a activity fai uso do identificar completo formado polo nome do paquete e o nome da activity (vos aparecerá un paquete diferente ao da imaxe, pero o concepto é o mesmo).
Image:PDM_Activity_4.jpg| Como sucede en Java, o nome da clase ten que ser o mesmo que o nome físico do arquivo onde está creada. Este nome ten que corresponder có nome indicado no AndroidManifiest.xml
+
Image:PDM_Activity_4.jpg| Como sucede en Java, o nome da clase ten que ser o mesmo que o nome físico do arquivo onde está creada. Este nome ten que corresponder có nome indicado no AndroidManifiest.xml.
 +
Image:PDM_Activity_4B.jpg| Se ao crear unha activity vos da un erro coa clase R, pode ser debido a que non teñades importado dita clase.
 +
Image:PDM_Activity_4C.jpg| Se non tedes [http://wiki.cifprodolfoucha.es/index.php?title=PDM_UD1_Co%C3%B1ecendoAndroidStudio#Automaticamente a importación automática de clases] teredes que escribilo manualmente o sobre o erro (neste caso teriades que situar o cursor sobre a clase R) premer as teclas '''Alt+Enter''', escollendo a opción '''import class'''. Se tedes activada a importación automática soamente tedes que premer en calquera liña da activity.
 
Image:PDM_Activity_5.jpg| Para cambiar o nome podemos facer uso da utilidade Refactor => Rename. Premendo o botón dereito sobre o recurso que queiramos cambiar, escolleremos estas opcións y automaticamente cambiará o nome en todos los arquivos necesarios.
 
Image:PDM_Activity_5.jpg| Para cambiar o nome podemos facer uso da utilidade Refactor => Rename. Premendo o botón dereito sobre o recurso que queiramos cambiar, escolleremos estas opcións y automaticamente cambiará o nome en todos los arquivos necesarios.
 +
</gallery>
 +
 +
: <u>Nota:</u> Fixarse que na imaxe o nome do paquete está errado. Pon 'UD2.Acvities'. Probade a cambiar o nome coa mesma opción 'Refactor'.
 +
 +
 +
 +
<br />
 +
* Ao cambiar a forma en como Android Studio crea a activity por defecto (de clase AppCompatActivity), teremos dúas consecuencias:
 +
 +
:* Se [https://wiki.cifprodolfoucha.es/index.php?title=PDM_UD1_Bibliotecas_de_compatibilidade#Versi.C3.B3n_antiga empregamos a opción antiga das bibliotecas de compatabilidade]:
 +
::<gallery caption="Empregando AppCompactActivity con bibliotecas de compatibilidade antigas" widths="350" heights="300px" perrow="2">
 +
Image:PDM_Activity_8.jpg| A activity creada <u>xa non deriva da clase Activity</u>, se non da clase AppCompatActivity do paquete de compatibilidade v7.
 +
Image:PDM_Activity_9.jpg| Engadiuse ao arquivo '''build.gradle''' a biblioteca de compatibilidade xa que facemos uso dela na activity creada.
 +
</gallery>
 +
 +
<br />
 +
:* Se [https://wiki.cifprodolfoucha.es/index.php?title=PDM_UD1_Bibliotecas_de_compatibilidade#Versi.C3.B3n_actual empregamos a nova forma androidx] teremos que:
 +
::<gallery caption="Empregando AppCompactActivity con bibliotecas de compatibilidade androidx" widths="350" heights="300px" perrow="2">
 +
Image:PDM_Activity_8B.jpg| A activity creada <u>xa non deriva da clase Activity</u>, se non da clase AppCompatActivity do paquete de compatibilidade androidx.appcompat.app.
 +
Image:PDM_Activity_9B.jpg| Engadiuse ao arquivo '''build.gradle''' a biblioteca de compatibilidade xa que facemos uso dela na activity creada.
 
</gallery>
 
</gallery>
  
  
  
* Como vimos no asistente, á hora de crear unha activity aparecen dúas opcións que non marcamos:
+
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
* Como vimos no asistente, á hora de crear unha activity aparece unha opción que indica Launcher Activity:
 
:* Launcher Acivity: Fai que dita activity poida ser lanzada ou executada de forma independente. Isto quere dicir que o resto de activities que non teñen marcada esta opción van necesitar ser invocadas dende outra activity. Ao crear unha activity e marcar esta opción, levará consigo dúas consecuencias:
 
:* Launcher Acivity: Fai que dita activity poida ser lanzada ou executada de forma independente. Isto quere dicir que o resto de activities que non teñen marcada esta opción van necesitar ser invocadas dende outra activity. Ao crear unha activity e marcar esta opción, levará consigo dúas consecuencias:
  
 
<gallery caption="Creando unha nova activity coa opción Launcher actividada" widths="350" heights="300px" perrow="2">
 
<gallery caption="Creando unha nova activity coa opción Launcher actividada" widths="350" heights="300px" perrow="2">
 +
Image:PDM_Activity_6A.jpg| Creamos unha segunda activity no mesmo paquete (UD2.Activities) coa opción Launcher Actividada.
 
Image:PDM_Activity_6.jpg| Engade unha sección nova á activity no arquivo AndroidManifiest.xml. Xa veremos para que serve pero esas dúas liñas estalle a indicar ao S.O. Android de que activity pode ser lanzada de forma independente e que non vai recibir datos doutra activity.
 
Image:PDM_Activity_6.jpg| Engade unha sección nova á activity no arquivo AndroidManifiest.xml. Xa veremos para que serve pero esas dúas liñas estalle a indicar ao S.O. Android de que activity pode ser lanzada de forma independente e que non vai recibir datos doutra activity.
Image:PDM_Activity_7.jpg| Se ides ao dispositivo físico ou emulador podedes comprobar como aparecen as dúas activities que poden ser lanzadas de forma independente.
+
Image:PDM_Activity_7.jpg| Se lanzadas a aplicación e ides ao dispositivo físico ou emulador podedes comprobar como aparecen as dúas activities que poden ser lanzadas de forma independente.
 
</gallery>
 
</gallery>
  
  
  
:* A outra opción é a de '''Backwards Compatibility''': Esta opción está colocada para facer uso das bibliotecas de compatibilidade de Android, xa vistas [http://wiki.cifprodolfoucha.es/index.php?title=PDM_UD1_Bibliotecas_de_compatibilidade nesta wiki anteriormente].
 
:: Ao marcar esta opción teremos dúas consecuencias:
 
 
<gallery caption="Creando unha nova activity coa opción Backwards Compatibility" widths="350" heights="300px" perrow="2">
 
Image:PDM_Activity_8.jpg| A activity creada <u>xa non deriva da clase Activity</u>, se non da clase AppActivity do paquete de compatibilidade v7.
 
Image:PDM_Activity_9.jpg| Engadiuse ao arquivo '''build.gradle''' a biblioteca de compatibilidade xa que facemos uso dela na activity creada.
 
</gallery>
 
  
  
  
* Indicar que nas opcións de configuración de execución do proxecto, podemos indicar, podemos indicar cal é a activity por defecto a lanzar (se non se especifica será a primeira que sexa de tipo launcher) e o emulador por defecto que vai lanzar:
+
* Indicar que nas opcións de configuración de execución do proxecto, podemos indicar cal é a activity por defecto a lanzar (se non se especifica será a primeira que sexa de tipo launcher) e o emulador por defecto que vai lanzar:
 
<gallery caption="Modificando as opcións da configuración de execución" widths="350" heights="300px" perrow="2">
 
<gallery caption="Modificando as opcións da configuración de execución" widths="350" heights="300px" perrow="2">
 
Image:PDM_Activity_10.jpg| Editamos a configuración...
 
Image:PDM_Activity_10.jpg| Editamos a configuración...
Línea 69: Línea 107:
 
<gallery caption="Creando un novo paquete" widths="350" heights="300px" perrow="2">
 
<gallery caption="Creando un novo paquete" widths="350" heights="300px" perrow="2">
 
Image:PDM_Activity_12.jpg| Botón dereito sobre o paquete no que queremos crear un subpaquete.
 
Image:PDM_Activity_12.jpg| Botón dereito sobre o paquete no que queremos crear un subpaquete.
Image:PDM_Activity_13.jpg| Introducimos o nome do paquete a crear.
+
Image:PDM_Activity_13.jpg| Introducimos o nome do paquete a crear. Lembrar que cada paquete está dentro dun cartafol. O paquete UD2 non aparece xa que non hai clases nel. Se abrimos o explorador de arquivos e creamos un arquivo dentro do cartafol UD2 veremos como Android Studio o amosa.
 
Image:PDM_Activity_14.jpg| Arrastramos as activities ao novo paquete. Sairá unha ventá e premeremos o botón '''Refactor'''. Se vos da algún tipo de erro probade a arrastralas dunha en unha e limpar o proxecto e volvelo a compilar.
 
Image:PDM_Activity_14.jpg| Arrastramos as activities ao novo paquete. Sairá unha ventá e premeremos o botón '''Refactor'''. Se vos da algún tipo de erro probade a arrastralas dunha en unha e limpar o proxecto e volvelo a compilar.
 +
Image:PDM_Activity_14B.jpg| Prememos o botón de 'Refactor'.
 
Image:PDM_Activity_15.jpg| Fixarse como agora no AndroidManifiest.xml aparece o novo paquete.
 
Image:PDM_Activity_15.jpg| Fixarse como agora no AndroidManifiest.xml aparece o novo paquete.
 
</gallery>
 
</gallery>
Línea 78: Línea 117:
  
 
<br />
 
<br />
=Ciclo de vida das activities=
+
 
 +
=Ciclo de vida das Activities=
  
 
* Máis información [http://developer.android.com/training/basics/activity-lifecycle/starting.html neste enlace].
 
* Máis información [http://developer.android.com/training/basics/activity-lifecycle/starting.html neste enlace].
  
  
* Cando se lanza unha activity esta pasa por unha serie de estados e eses estados chaman a unha serie de métodos.
+
* Unha aplicación de Android pode estar conformada por moitas activities (pantallas) e incluso llegar a chamar a outras aplicación.
 +
: Cada vez que unha activity chama a outra, a primeira non se destrúe, se non que queda nunha cola LIFO (Stack).
 +
: Cando prememos o botón Back do móbil ou pechamos a activity actual, recupera a activity que estaba na cola.
 +
[[Imagen:PDM_Ciclo_Vida_1.jpg|400px|center]]
  
[[Imagen:00_basic-lifecycle.png|500px|center]]
+
 
 +
 
 +
 
 +
 
 +
* Cando se lanza unha activity esta pasa por unha serie de estados e eses estados chaman a unha serie de métodos, ao igual que cando pechamos ou abrimos unha nova activity.
 +
 
 +
[[Imagen:00_basic-lifecycle.png|800px|center]]
  
 
<u>Nota:</u> O estado '''Resumed:''' ven ser o estado de running.
 
<u>Nota:</u> O estado '''Resumed:''' ven ser o estado de running.
  
  
 +
* Veremos [http://wiki.cifprodolfoucha.es/index.php?title=Ciclo_de_vida_dunha_aplicaci%C3%B3n máis adiante nesta Wiki] diferentes métodos para gardar e recuperar o estado dunha Activity.
  
 
<br />
 
<br />
 +
==Métodos asociados aos estados==
 +
 
* Estes son os diferentes métodos e o que se debería facer en cada un deles:
 
* Estes son os diferentes métodos e o que se debería facer en cada un deles:
  
Línea 97: Línea 149:
 
::* Definir / instanciar variables – clases  
 
::* Definir / instanciar variables – clases  
 
::* Definir a interface do usuario.
 
::* Definir a interface do usuario.
 +
::* Vincular datos a listas.
  
 
:: Unha vez chamado o método onCreate chama os métodos onStart e onResume de forma consecutiva.
 
:: Unha vez chamado o método onCreate chama os métodos onStart e onResume de forma consecutiva.
Línea 102: Línea 155:
  
  
:* '''Método onDestroy''': Chamado cando remata a aplicación e se libera da memoria do dispositivo. Tamén pode ser provocado polo S.O. para liberar espazo de memoria. Normalmente non se fai nada neste método, xa que a liberación de recursos se fai nos métodos onPause e onStop, pero se a aplicación usa background Threads ou outro recurso que poida consumir memoria, debe ser destruído neste evento.
+
:* '''Método onDestroy''': Chamado cando remata a aplicación e se libera da memoria do dispositivo, cando pechamos unha activity ou cando prememos o botón BACK. Tamén pode ser provocado polo S.O. para liberar espazo de memoria. Se a aplicación usa background Threads ou outro recurso que poida consumir memoria, debe ser destruído neste evento. Normalmente liberaremos os recursos que foron 'instanciados' no método onCreate.
  
 
:: <u>Nota:</u> Só hai un caso no que non pasa polos métodos de onPause e onStop, é cando destruímos a aplicación chamando o método finish() dende onCreate.
 
:: <u>Nota:</u> Só hai un caso no que non pasa polos métodos de onPause e onStop, é cando destruímos a aplicación chamando o método finish() dende onCreate.
Línea 124: Línea 177:
 
:: Hai que ter en conta que entramos neste método cando vimos de inicializar a aplicación e cando paramos a aplicación, polo que pode ser necesario verificar se xa estaban creados os recursos antes de volver a crealos.
 
:: Hai que ter en conta que entramos neste método cando vimos de inicializar a aplicación e cando paramos a aplicación, polo que pode ser necesario verificar se xa estaban creados os recursos antes de volver a crealos.
  
:: Vexamos un suposto exemplo no que facemos uso da cámara. Como vemos comprobamos se o obxecto que vai facer uso da cámara está xa inicializado.
+
:: A aplicación permanece neste estado ata que se cambie de activity ou
 +
 
 +
:: Vexamos un suposto exemplo no que facemos uso da cámara. Como vemos comprobamos se o obxecto que vai facer uso da cámara está xa inicializado. Isto pode pasar nunha aplicación multiventana no que pasemos o foco a outra ventá e despois volvamos á ventá inicial.
 
<syntaxhighlight lang="java" line highlight="">
 
<syntaxhighlight lang="java" line highlight="">
 
     @Override
 
     @Override
Línea 159: Línea 214:
 
:: No método onRestart se poden recuperar cursores de acceso a datos que foran pechados previamente no método onStop. Máis información [https://developer.android.com/reference/android/app/Activity#onRestart() neste enlace].
 
:: No método onRestart se poden recuperar cursores de acceso a datos que foran pechados previamente no método onStop. Máis información [https://developer.android.com/reference/android/app/Activity#onRestart() neste enlace].
  
 +
:: A aplicación non permanece nestes estados, se non que pasa directamente ao estado Resumed e chama ao método asociado onResume().
  
  
  
<br />
+
* '''<u>NOTA IMPORTANTE:</u>''' Se sobreescribides calquera destes métodos tedes que chamar en primeiro lugar ao método da superclase da forma: super.Método();
=Recreando unha Activity=
 
 
 
* Existen varias casos que poden provocar a eliminación da nosa aplicación en segundo plano, coma son que non se usa en bastante tempo (e permaneza en background) ou que o sistema necesite memoria e teña que liberar recursos coma son os procesos en background.
 
 
 
* Nestes casos, se o usuario quere volver á nosa aplicación, o sistema operativo garda anteriormente o ‘estado’ en que quedou a nosa aplicación, no que se coñece coma ‘instance state’ ou estado de instancia. Dito estado está gardado nun obxecto da clase Bundle que garda pares de clave-valor.
 
: Por iso cando volvemos os elementos gráficos están tal como os deixamos (caixas de texto con datos, elementos de lista escollidos,...)
 
: Soamente se se destrúe a aplicación (por necesidades de memoria, por exemplo) estes datos se perden.
 
 
 
 
 
: <u>Nota:</u> cando un usuario move a pantalla e a reorienta noutra dirección, a aplicación se destrúe e se volve a crear.
 
 
 
 
 
* Seguramente a aplicación ten outra información aparte do estado das View´s que é necesario recuperar, como as variables usadas para gardar o progreso do usuario ou calquera outra información que nos como programadores queiramos gardar. Incluso o estado dos elementos gráficos podería ser necesario gardalo para asegurarnos que pase o que pase, cando o usuario inicie a aplicación continúe no punto onde o deixou.
 
 
 
: Para iso existe o método onSaveInstanceState que chama o sistema cando destrúe a aplicación.
 
[[Imagen:PDM_Activity_15.jpg|400px|center]]
 
 
 
 
 
: A este método lle pasa o obxecto da [https://developer.android.com/reference/android/os/Bundle?hl=es-419 clase Bundle] onde está gardada toda a información (view´s) da aplicación, polo que o programador pode engadir máis información para ser recuperada posteriormente se o sistema volta a chamar a aplicación, xa que lle volve a pasar o mesmo obxecto da clase Bundle.
 
 
 
 
 
: <u>Nota:</u> Antes de chegar o estado Resumed pasa polo estado Started.
 
 
 
 
 
 
 
* Exemplo:
 
<syntaxhighlight lang="java" line highlight="">
 
@Override
 
public void onSaveInstanceState(Bundle datosgardados){
 
 
datosgardados.putInt(“POSICION”,reproductor.getPosicionActualCancion());
 
datosgardados.putString(“CANCION”,reproductor.cancionactual);
 
 
 
// SEMPRE O CODIGO POSTO POR NOS ANTES DA CHAMADA A SUPER.
 
super.onSaveInstanceState(datosgardados);
 
}
 
</syntaxhighlight>
 
 
 
 
 
: Para restaurar o sistema usaremos o método onRestoreInstanceState.
 
<syntaxhighlight lang="java" line highlight="">
 
@Override
 
public void onRestoreInstanceState(Bundle datosgardados){
 
 
super.onRestoreInstanceState(datosgardados);
 
 
 
// CODIGO POSTO POR NOS PARA RECUPERAR OS DATOS, SEMPRE DESPOIS
 
// DA CHAMADA A SUPER
 
reproductor.cancionactual=datosgardados.getString(C_DATOCANCION_PECHAR);
 
reproductor.posicioncancion=datosgardados.getInt(C_DATOPOSCANCION_PECHAR);
 
 
}
 
 
 
</syntaxhighlight>
 
 
 
:<u>Nota:</u> É importante chamar os métodos super.XXXXX na orde indicada no exemplo anterior.
 
 
 
 
 
* Imos ver un exemplo práctico disto.
 
: Crea un novo paquete de nome '''gardandoestado'''.
 
: Dentro do paquete crea unha nova clase de tipo '''Launcher Activity''' de nome '''UD2_01_gardando_estado'''.
 
: Cambia o contido do arquivo XML por este:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
  
  
  
 +
<br />
 +
'''[https://wiki.cifprodolfoucha.es/index.php?title=Programaci%C3%B3n_de_dispositivos_m%C3%B3biles#UNIDADE_2:_A_interface_de_usuario. Enlace a la página principal de la UD2]'''
 +
<br />
 +
<br />
 +
'''[https://wiki.cifprodolfoucha.es/index.php?title=Programación_de_dispositivos_móbiles Enlace a la página principal del curso]'''
 +
<br />
  
  
  
 
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2018).
 
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2018).

Revisión actual del 13:01 21 nov 2020

Introdución

  • Como xa comentamos antes, podemos identificar unha 'Activity' con cada unha das pantallas que conforman unha aplicación.
  • Isto non é totalmente certo, xa que podemos ter aplicacións que non teñan interface gráfica, coma os servizos, programas que se executan en segundo plano e que responden a un determinado tipo de evento.


  • Neste punto imos explicar os diferentes métodos polos que pasa unha Activity cando se crea, ponse en segundo plano ou se destrúe.
Indicaremos en cada un deles cales serían as principais funcións que poderíamos programar.
Tamén explicaremos como se define unha activity a nivel de proxecto.


Preparación previa:

Se non o temos creado antes, crea un paquete de nome UD2 e dentro deste outro paquete de nome Activities.
PDM Activity 0A.jpg
Vos debe quedar como na imaxe anterior. Indicar que fisicamente temos creados os cartafoles UD2/Activities pero como non existen clases no cartafol UD2/ Android Studio o oculta.


Creando Activities

  • En Android existen moitos tipos de 'Activities'.
Todas elas teñen en común que son ventás onde se van 'debuxar' elementos da interface do usuario.
  • Neste punto imos centrarnos en dous tipos de activity:
Son activities clásicas onde o usuario van interaccionar con compoñentes gráficos.
Son activities que derivan de Activity e que se atopan dentro da librería de compatibilidade v7.
Teñen a mesma función que as de clase Activity (servir como pantallas para interaccionar con compoñentes gráficos). Inicialmente foron creadas para que se puidera empregar o AppBar en versións de Android anteriores a que aparecera.
Existen novas funcionalidades que van poder ser empregadas en versións Android anteriores a que apareceran grazas o uso desta clase como xa vimos anteriormente nesta Wiki.
Na versión actual de Android Studio (Sept.2019) xa crea por defecto as activities desta clase.



  • Cada vez que se crea unha activity, aparece unha nova entrada no arquivo AndroidManifiest.xml.
Vexamos un exemplo, e crearemos unha nova activity no asistente:
Nota: Fixarse que na imaxe o nome do paquete está errado. Pon 'UD2.Acvities'. Probade a cambiar o nome coa mesma opción 'Refactor'.



  • Ao cambiar a forma en como Android Studio crea a activity por defecto (de clase AppCompatActivity), teremos dúas consecuencias:
  • Empregando AppCompactActivity con bibliotecas de compatibilidade antigas
  • A activity creada xa non deriva da clase Activity, se non da clase AppCompatActivity do paquete de compatibilidade v7.

  • Engadiuse ao arquivo build.gradle a biblioteca de compatibilidade xa que facemos uso dela na activity creada.


  • Empregando AppCompactActivity con bibliotecas de compatibilidade androidx
  • A activity creada xa non deriva da clase Activity, se non da clase AppCompatActivity do paquete de compatibilidade androidx.appcompat.app.

  • Engadiuse ao arquivo build.gradle a biblioteca de compatibilidade xa que facemos uso dela na activity creada.





    • Como vimos no asistente, á hora de crear unha activity aparece unha opción que indica Launcher Activity:
    • Launcher Acivity: Fai que dita activity poida ser lanzada ou executada de forma independente. Isto quere dicir que o resto de activities que non teñen marcada esta opción van necesitar ser invocadas dende outra activity. Ao crear unha activity e marcar esta opción, levará consigo dúas consecuencias:




    • Indicar que nas opcións de configuración de execución do proxecto, podemos indicar cal é a activity por defecto a lanzar (se non se especifica será a primeira que sexa de tipo launcher) e o emulador por defecto que vai lanzar:


    • Crea un novo paquete de nome 'tiposactivities' e move as activities creadas anteriormente a ese paquete.
    Deixa a lo menos unha activity no paquete inicial, xa que se non a nivel gráfico o Android Studio o fai desaparecer.
    Nota: Lembra, como sucede en Java, cada paquete se traduce nun cartafol a nivel de S.O.



    Ciclo de vida das Activities


    • Unha aplicación de Android pode estar conformada por moitas activities (pantallas) e incluso llegar a chamar a outras aplicación.
    Cada vez que unha activity chama a outra, a primeira non se destrúe, se non que queda nunha cola LIFO (Stack).
    Cando prememos o botón Back do móbil ou pechamos a activity actual, recupera a activity que estaba na cola.
    PDM Ciclo Vida 1.jpg



    • Cando se lanza unha activity esta pasa por unha serie de estados e eses estados chaman a unha serie de métodos, ao igual que cando pechamos ou abrimos unha nova activity.
    00 basic-lifecycle.png

    Nota: O estado Resumed: ven ser o estado de running.



    Métodos asociados aos estados

    • Estes son os diferentes métodos e o que se debería facer en cada un deles:
    • Método onCreate:
    • Definir / instanciar variables – clases
    • Definir a interface do usuario.
    • Vincular datos a listas.
    Unha vez chamado o método onCreate chama os métodos onStart e onResume de forma consecutiva.


    • Método onDestroy: Chamado cando remata a aplicación e se libera da memoria do dispositivo, cando pechamos unha activity ou cando prememos o botón BACK. Tamén pode ser provocado polo S.O. para liberar espazo de memoria. Se a aplicación usa background Threads ou outro recurso que poida consumir memoria, debe ser destruído neste evento. Normalmente liberaremos os recursos que foron 'instanciados' no método onCreate.
    Nota: Só hai un caso no que non pasa polos métodos de onPause e onStop, é cando destruímos a aplicación chamando o método finish() dende onCreate.


    • Método onPause: Cando unha aplicación, ocupa parte da pantalla, pero deixa visible parte de aplicación en execución, esta pasa a un estado de PAUSE (por exemplo unha caixa de diálogo aberta por unha aplicación). En caso contrario, se queda totalmente tapada pasa a o estado de STOP.
    Ó volver do estado de Pause, se chama o método onResume.
    Normalmente cando se chama o proc. onPause, é que a aplicación vai deixar de se usada por o usuario. Neste caso se aproveita este estado para facer:
    • Parar animacións ou outras actividades que consuman CPU.
    • Gardar a información que o usuario espera atopar se volve a cargar a aplicación (redacción dun correo sen rematar,…).
    • Liberar recursos do sistema, como transferencias, sensores (GPS), ou calquera recurso que poida afectar á batería (como a cámara).
    Non se debe sobrecargar este método con ‘traballo’ pesado de liberación, xa que podemos enlentecer o paso ó seguinte estado. Para iso temos o método onStop.


    • Método onResume: Úsase este método para volver a crear aqueles recursos que liberamos no método onPause.
    Hai que ter en conta que entramos neste método cando vimos de inicializar a aplicación e cando paramos a aplicación, polo que pode ser necesario verificar se xa estaban creados os recursos antes de volver a crealos.
    A aplicación permanece neste estado ata que se cambie de activity ou
    Vexamos un suposto exemplo no que facemos uso da cámara. Como vemos comprobamos se o obxecto que vai facer uso da cámara está xa inicializado. Isto pode pasar nunha aplicación multiventana no que pasemos o foco a outra ventá e despois volvamos á ventá inicial.
    1     @Override
    2     protected  void onResume(){
    3         super.onResume();
    4 
    5         if (mCamara==null){
    6             inicializarCamara();
    7         }
    8     }
    


    • Método onStop.
    Existen uns poucos casos no que isto sucede:
    • Usuario abre outra aplicación ou vai as aplicación recentes e escolle outra. Ata que non volva á nosa aplicación, esta pasa a un estado de stop e se queda en segundo plano.
    • Usuario provoca a aparición doutra activity. A primeira activity é parada e comeza a segunda. Se o usuario preme o botón de ‘Volver’ a primeira actividade é reiniciada.
    • Usuario recibe unha chamada de teléfono.
    Temos por tanto os métodos onStop e onRestart para dar soporte a estes eventos.
    No método onStop é onde debemos facer as operación que máis leven de liberación de recursos coma poidan ser gardar datos nunha base de datos.
    Nota: O sistema garda o estado das View, polo que os contidos de caixas de texto e outros recursos gráficos se manteñen ó reiniciar a aplicación. Soamente se perden se o S.O. necesita espazo en memoria e quita a aplicación do Stack, destruíndo todo. Nese caso se o usuario volve, os elementos gráficos estarían inicializados.


    • Método onRestart e método onStart:
    Cando o sistema chama o método reiniciar tamén chama despois o método onStart (cada vez que aplicación se pon visible).
    Debido a isto, se debe de inicializar os compoñentes que foron liberados no método onStop e tamén se debe aproveitar ese mesmo código cando se crea por primeira vez a aplicación.
    Por exemplo, no método onStart se poden poñer as condicións necesarias para que poida funcionar a aplicación (coma por exemplo recursos que necesitemos, coma GPS, unha cámara,....).
    No método onRestart se poden recuperar cursores de acceso a datos que foran pechados previamente no método onStop. Máis información neste enlace.
    A aplicación non permanece nestes estados, se non que pasa directamente ao estado Resumed e chama ao método asociado onResume().


    • NOTA IMPORTANTE: Se sobreescribides calquera destes métodos tedes que chamar en primeiro lugar ao método da superclase da forma: super.Método();




    Enlace a la página principal de la UD2

    Enlace a la página principal del curso



    -- Ángel D. Fernández González -- (2018).