Diferencia entre revisiones de «PDM Activities»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 149: 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 176: 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 210: Línea 213:
 
:: 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,....).
 
:: 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 [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().
  
  

Revisión del 17:54 11 oct 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. 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.
    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();





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