Chronometer. Cliclo de vida I (finish())

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

Introdución

  • Un control Chronometer implementa en Android un cronómetro simple.
  • Iníciase con start()
  • Párase con stop(). Pero ... el segue contando por detrás. Isto é, se se executa de novo start() sen parámetros porá o cronómetro no mesmo tempo que se non se parase.
  • Cando se chama a start(), o control colle o tempo que leva acceso o móbil (elapsedRealtime()) como tempo base e vai contando dende aí.


  • Se non se lle dá un tempo base el colle o tempo no cal se chama a start().


  • Para establecer un tempo base úsase setBase()


  • Por defecto amosa o tempo en formato "MM:SS". Pódese usar setFormat(String) para cambiar o formato.


  • A clase Chronometer herda directamente da clase View.


  • Para establecer os valores de tempos base apoiámonos na clase SystemClock.


Caso práctico

  • Comezamos creando o proxecto U2_14_Chronometer
  • Creamos unha aplicación que cando ten un cronómetro que hai que iniciar e que pasado un tempo se non se parou a aplicación autodestrúese.


XML do Layout

  • Observar como se crea o control Chronometer e os métodos aos que chaman os botóns.
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <TextView
 8         android:id="@+id/tv_autodestruccion"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="Autodestrucción en: ?? seg" />
12 
13     <Chronometer
14         android:id="@+id/cronometro"
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:layout_gravity="center_horizontal"
18         android:textSize="20sp" />
19 
20     <LinearLayout
21         android:layout_width="match_parent"
22         android:layout_height="match_parent"
23         android:gravity="center_horizontal"
24         android:orientation="horizontal" >
25 
26         <Button
27             android:id="@+id/start"
28             android:layout_width="wrap_content"
29             android:layout_height="wrap_content"
30             android:onClick="onStartClick"
31             android:text="Start" />
32 
33         <Button
34             android:id="@+id/stop"
35             android:layout_width="wrap_content"
36             android:layout_height="wrap_content"
37             android:onClick="onStopClick"
38             android:text="Stop" />
39     </LinearLayout>
40 
41 </LinearLayout>

Código Java

 1 package com.example.u2_14_chronometer;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.SystemClock;
 6 import android.view.Menu;
 7 import android.view.View;
 8 import android.widget.Chronometer;
 9 import android.widget.Chronometer.OnChronometerTickListener;
10 import android.widget.TextView;
11 
12 public class U2_14_Chronometer extends Activity {
13 	Chronometer crono;
14 	TextView tvAutodestrucion;
15 	int tempoAutodestrucion;
16 
17 	@Override
18 	protected void onCreate(Bundle savedInstanceState) {
19 		super.onCreate(savedInstanceState);
20 		setContentView(R.layout.activity_u2_14__chronometer);
21 		crono = (Chronometer) findViewById(R.id.cronometro);
22 		tvAutodestrucion = (TextView) findViewById(R.id.tv_autodestruccion);
23 
24 		crono.setOnChronometerTickListener(new OnChronometerTickListener() {
25 			@Override
26 			public void onChronometerTick(Chronometer chronometer) {
27 				// TODO Auto-generated method stub
28 
29 				long tempoPasado = SystemClock.elapsedRealtime()
30 						- chronometer.getBase();
31 				int tempoSeg = (int) tempoPasado / 1000;
32 				if (tempoSeg == tempoAutodestrucion)
33 					finish();
34 
35 				tvAutodestrucion.setText("Autodestrucción en: "
36 						+ (tempoAutodestrucion - tempoSeg) + " seg");
37 			}
38 		});
39 	}
40 
41 	public void onStartClick(View v) {
42 		tempoAutodestrucion = 20;
43 		crono.setBase(SystemClock.elapsedRealtime());
44 		crono.start();
45 	}
46 
47 	public void onStopClick(View v) {
48 		crono.stop();
49 	}
50 
51 	@Override
52 	public boolean onCreateOptionsMenu(Menu menu) {
53 		// Inflate the menu; this adds items to the action bar if it is present.
54 		getMenuInflater().inflate(R.menu.u2_14__chronometer, menu);
55 		return true;
56 	}
57 
58 }
  • Liña 42: Definimos o tempo para a autodestrucción da Activity. Cando se vexan os menús, veremos que este valor podería ser configurado polo usuario que usa a aplicación, como unha opción da mesma.
  • Liña 43: establécese o tempo base a partir do cal o cronómetro comeza a contar.
    • SystemClock.elapsedRealtime(): devolve o tempo, en milisegundos, que leva aceso o móbil
  • Liña 44: o cronómetro comeza a contar, non dende cero, senón dende o tempo tomado como base (o tempo que leva acceso o móbil).
  • Liña 48: párase o cronómetro.
  • Liña 24: establécese o Listener do cronómetro. Este método vai ser chamado cada vez que o cronómetro cambia de valor.
  • Liñas 29 e 30: O tempo que pasou dende que se iniciou o cronómetro é a diferencia entre o tempo que leva acceso o dispositivo e o tempo no cal se iniciou o cronómetro.
  • Liña 31: Tempo en segundos.
  • Liña 33: Se chegamos ao tempo para autodestrucción hai que matar a Activity. Sería o mesmo que se prememos o botón da botonera "Retroceso ou Back".

Ciclo de vida dunha actividade

  • Afondarase máis adiante sobre o ciclo de vida dunha actividade.
  • Unha actividade desde que se lanza pasa por moitos estados.
  • Cando unha actividade non está en primeira liña da pantalla non está destruída senón que está en estado de Stop (Oculta) esperando na pila a ser chamada, ou se está moi abaixo na pila e se precisan os seus recursos entón o sistema pode destruíla.

00 basic-lifecycle.png

  • No noso exemplo a actividade destrúese explicitamente se o cronómetro chega a un tempo determinado
  • Para iso úsase o método finish().
  • Ver liña 33 do código.




-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).