martes, 7 de febrero de 2012

Lanzar una aplicacion cuando el dispositvo arranca.

¿Como se puede hacer? Metiendo en la aplicación un receptor de banda ancha que espere la llegada de un intento que indique que el dispositivo ha arrancado. ¿Como se mete el receptor de banda ancha? Podemos hacerlo de manera dinámica:
package es.jodio.elandroid.este
import android.content.*;
public class ReceptorBandaAncha extends  android.content.BroadcastReceiver
{ 
 @Override
 public void onReceive(Context arg0, Intent arg1)
 { 
  ...
 }
}
Y habrá que saber a que intento queremos hacer caso. Los intentos son como mensajes a broadcast con un id. Así que habrá que indicar a que id atenderemos. En este caso sería algo así: "android.intent.action.BOOT_COMPLETED" IntentFilter filter = new IntentFilter ("android.intent.action.BOOT_COMPLETED" ); ReceptorBandaAncha miRBA = new ReceptorBandaAncha(); registrarReceiver(miRBA, filter); Luego para dejar de estar registrados al intento podriamos hacerlo así: unregisterReceiver (ReceptorBandaAncha); Tambien se puede hacer de manera estática. De esta manera en cuanto se lanze el intento asociado esta se recibirá esté o no la aplicación en marcha.En el manifest metemos:

    
        
    

Enlaces: Android developers - BroadcastReceiver: Android developers - Intent and Intent Filters:

miércoles, 1 de febrero de 2012

Tres puntos en los argumentos de un método (varargs)

Viendo este método :
 public Animation (float frameDuration, TextureRegion... keyFrames) {
  this.frameDuration = frameDuration;
  this.keyFrames = keyFrames;
 }
Me he quedado picueto. No habia visto nunca lo de los tres puntos en el paso de parametros a un método. Resulta que es para indicar que no sabemos cuántos elementos de un tipo en concreto se pasarán al método. Osea un array del tipo indicado sin tamaño fijo. En esta web lo explican mejor.
<a href="http://www.codexion.com/tutorialesjava/java/javaOO/arguments.html"></a>

Comunicaciones UDP III. El Receptor

package es.vaprel.qkandroid.Communications;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.concurrent.BlockingQueue;

import com.badlogic.gdx.Gdx;

public class ComunicacionesReceptor extends Thread
{ 
 byte [] datosArrayByte;
 InetAddress direccionIp = null; 
 DatagramSocket recepcionSocket;
 DatagramPacket dato;
 private final BlockingQueue colamensajes;
 boolean socetOK = true;
 
 public ComunicacionesReceptor(BlockingQueue colamensajes,InetAddress direccionIp) 
   throws SocketException
 {
  this.direccionIp = direccionIp;
  this.colamensajes = colamensajes;     
  datosArrayByte = new byte[Comunicaciones.PAQUETE_SIZE]; 
  try
  {
   recepcionSocket = new DatagramSocket(Comunicaciones.PUERTO_DONDE_RECIBO);
  }
  catch (IOException ioe)
  {   
   Gdx.app.log("ERROR: ", ioe.getLocalizedMessage(), ioe);
  }      
 } 
 
 @Override
 public void run() {  
  dato = new DatagramPacket(new byte[Comunicaciones.PAQUETE_SIZE], Comunicaciones.PAQUETE_SIZE);
  while (socetOK)
  {
   try
   {
    // BLOQUEANTE
    recepcionSocket.receive(dato);
    // BLOQUEANTE
    ProcesarPaquete(dato);
    if (Thread.interrupted()) {
        try {
      throw new InterruptedException();
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
/*
 * By convention, any method that exits by throwing an InterruptedException clears
 *  interrupt status when it does so.
 *  However, it's always possible that interrupt status will immediately be set again,
 *  by another thread invoking interrupt.
 * */
      e.printStackTrace();
      Gdx.app.log("ERROR: ", e.getLocalizedMessage(), e);
      CloseSocket();
     }
    }
   }
   catch(IOException ioe)
   {
    socetOK = false;    
    Gdx.app.log("ERROR: ", ioe.getLocalizedMessage(), ioe);
   }
  }    
 }
 
 //Cuando llega un datagrama lo encola en la cola de mensajes recibidos
 private void ProcesarPaquete(DatagramPacket dato)
 {    
  try
  {
   datosArrayByte = dato.getData();
   Mensaje auxmensaje = new Mensaje(datosArrayByte.toString());
   colamensajes.add(auxmensaje);
  }
  catch (Exception ex)
  {
   Gdx.app.log("ERROR: ", ex.getLocalizedMessage(), ex); 
  }
 }
 
 public void CloseSocket() {
  socetOK = false;
  recepcionSocket.close();    
 }
}