Android

Me presento

¿Qué es Android para un NO Freak?

¿Qué es Android para un NO Freak?

Definición
Android es un sistema operativo basado en el núcleo Linux diseñado originalmente para dispositivos móviles, pero que posteriormente se expandió su desarrollo para soportar otros dispositivos tales como tablet, reproductores MP3, netbook, PC, etc.

¿Qué es Android para nosotros?

¿Cómo se programa en Android?



Eclipse + ADT Plugin

¿Cómo se programa en Android?

Conceptos básicos

¿Cómo se programa en Android?

Conceptos básicos



Activity


Una actividad es una View

¿Cómo se programa en Android?

Conceptos básicos



Service


Un componente que corre en background

¿Cómo se programa en Android?

Conceptos básicos



Content Provider


Gestor de contenido de alto nivel

¿Cómo se programa en Android?

Conceptos básicos



Broadcast Receiver


Componente que responde a los mensajes del sistema

¿Cómo se programa en Android?

Conceptos básicos



Intent


Encargado de activar los componentes

¿Cómo se programa en Android?

Conceptos básicos



Manifest.xml


Definición de los componentes del programa

¿Cómo se programa en Android?

Hello World!
Resultado:

¿Cómo se programa en Android?

Hello World!
Activity
public class mainActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
}

¿Cómo se programa en Android?

Hello World!
Activity


¿Cómo se programa en Android?

Hello World!
Intent
Intent i = new Intent(getApplicationContext(), captureQRCodeActivity.class);
i.putExtra("pista", 1);
startActivity(i);

¿Cómo se programa en Android?

Hello World!
Manifest.xml


  
   
        
            
                
                
            
        
    

¿Cómo se programa en Android?

Hello World!!
View

¿Cómo se programa en Android?

Android_QR_Code!

MVC (Model View Controller)


¿Cómo se programa en Android?

Android_QR_Code!
Controller
public class Controller extends MVCController {

	private static final String LOG = "GeoRemindMe";

	private static Controller instance;
	private MVCControllerStateInterface	state;
	private Context context;
	private Server server;

}
 

¿Cómo se programa en Android?

Android_QR_Code!
Controller
public static Controller getInstace(Context context)
	{
		Log.v(LOG, "Controller-getInstance (context)");

		if (instance == null)
			instance = new Controller(context);

		return instance;
	}
	protected Controller(Context context)
	{		
		super(context);
		this.context = context;

		Log.v(LOG, "Controller-Controller (context)");

		// Creamos el estado y lo registramos en el MVC
		state = new ReadyState(this);
		this.changeMVCState(state);


		server = Server.getInstance(context, this);
	}
 

¿Cómo se programa en Android?

Android_QR_Code!
ControllerState
package org.georemindme.controller;

import android.os.Message;

public interface ControllerState
{
	boolean handleMessage(Message msg);
}
 

¿Cómo se programa en Android?

Android_QR_Code!
ReadyState
public class ReadyState implements MVCControllerStateInterface
{
	private static final String LOG = "GeoRemindMe";

	private final Controller controller;

	public ReadyState(Controller controller)
	{
		this.controller = controller;
	}
}
 

¿Cómo se programa en Android?

Android_QR_Code!
ReadyState
public boolean handleMessage(Message msg)
	{
		Log.v(LOG, "ReadyState-Receive What: " + msg.what + " || Obj: " + msg.obj);

		// El estado del controlador recibe los mensajes y realiza las acciones necesarias para cada uno de ellos
		switch(msg.what)
		{ 				
			case REQUEST:
				controller.getServerInstance().dameLaSiguientePista((String) msg.obj);
				return true;
			case RESPONSE_OK:
				controller.broadcastMessage(msg);
				return true;			
			case RESPONSE_ERROR:
				controller.broadcastMessage(msg);
				return true;

		}
		return false;
	}
 

¿Cómo se programa en Android?

Android_QR_Code!
ControllerProtocol
/**
 * Interfaz donde se define todo el protocolo de mensajes de la aplicación 
 * 
 * @author Ricardo C.
 */
public interface ControllerProtocol
{

	int REQUEST =			100;
	int RESPONSE_OK =		200;
	int RESPONSE_ERROR = 	500;


}
 

¿Cómo se programa en Android?

Android_QR_Code!
Server
	// URL de peticion
	private static final String URL = "http://www.rauljimenez.info/dev/tallerAndroid/api.php?id=";

	// Instancia del servidor
	private static Server instance;

	// Controller
	private Controller controller;

	// Conector
	private MVCViewComponent connector = null;

	// Cliente para la conexion con el servidor
	private JSONRPCClient	connection;
 

¿Cómo se programa en Android?

Android_QR_Code!
Server
	public final void dameLaSiguientePista(final String pista)
		{
			Log.v(LOG, "Server-dameLaSiguientePista ()");

			// Preparamos una hebra que será la que se encarga de la conexion con el servidor
			Thread thread = new Thread("dameLaSiguientePista_Thread")
			{
				public void run ()
				{
					JSONObject response = null;

					// Abrimos la conexion
					openConnection ();
 

¿Cómo se programa en Android?

Android_QR_Code!
Server
try {
	// Hacemos la peticion
	response = connection.callJSONObject(pista);
	closeConnection();

	// Capturamos los datos necesarios recibidos por el servidor
	if (response.optString("Pista"+pista) != "") {
		String pistilla = response.getString("Pista"+pista);
		// Todo ha ido perfecto, avisamos al controllador y le mandamos los datos
		controller.sendMessage(RESPONSE_OK, pistilla);
	}
	else {
		controller.sendMessage(RESPONSE_ERROR);
	}
} catch (JSONRPCException e) {
	// TODO Auto-generated catch block
	controller.sendMessage(RESPONSE_ERROR);
	e.printStackTrace();
}
 

¿Cómo se programa en Android?

Android_QR_Code!
Server
// Lanzamos la hebra
thread.start();	
 

¿Cómo se programa en Android?

Android_QR_Code!
App
public class App extends Application {

	private static final String	LOG	= "GeoRemindMe";

	private Controller	controller;

	public void onCreate()
	{
		Log.v (LOG, "App-onCreate");

		controller = Controller.getInstace(getApplicationContext());

	}

	/**
	 * If system has memory issues and it has to kill processes, this callback
	 * will be triggered.
	 * 
	 * @author Ricardo C.
	 */
	public void onLowMemory()
	{
		Log.v (LOG, "App-onLowMemory ()");

		super.onLowMemory();
	}

	/**
	 * If the applications is shutting down, this method will be called.
	 * 
	 * @author Ricardo C.
	 */
	public void onTerminate()
	{
		Log.v (LOG, "App-onTerminate ()");

		super.onTerminate();

		controller.sendMessage(MVCControllerMessages.MVCCONTROLLER_QUIT);
	}
}
 

¿Cómo se programa en Android?

Android_QR_Code!
JSONRPCHttpClient
public class JSONRPCHttpClient extends JSONRPCClient
{
	/*
	 * HttpClient to issue the HTTP/POST request
	 */
	private HttpClient						httpClient;
	
	/*
	 * Service URI
	 */
	private String							serviceUri;

	/*
	 * Service Method
	 */
	private String							methodUri;

	// HTTP 1.0
	private static final ProtocolVersion	PROTOCOL_VERSION	= new ProtocolVersion("HTTP", 1, 0);
}
 

¿Cómo se programa en Android?

Android_QR_Code!
JSONRPCHttpClient
public JSONRPCHttpClient(String uri)
	{
		httpClient = new DefaultHttpClient();
		serviceUri = uri;
		methodUri = null;

	}

	protected JSONObject doRequest(String method, Object[] params)
			throws JSONRPCException
	{
		Log.d("json-rpc", "JSONRPCHttpClient-doRequest(method, params)");

		// Copy method arguments in a json array
		JSONArray jsonParams = new JSONArray();
		if (params != null)
			for (int i = 0; i < params.length; i++)
			{
				jsonParams.put(params[i]);
			}

		// Create the json request object
		JSONObject jsonRequest = new JSONObject();
		methodUri = method;

		return doJSONRequest(jsonRequest);
	}

 

¿Cómo se programa en Android?

Android_QR_Code!
JSONRPCHttpClient

¿Cómo se programa en Android?

Android_QR_Code!
JSONRPCHttpClient

¿Cómo se programa en Android?

Android_QR_Code!
captureQRCodeActivity
public class captureQRCodeActivity extends Activity {

	private static final String LOG = "GeoRemindMe";

	private Controller _controller;

	private MVCViewComponent _connector = null;

	// Interface
	private TextView _pista;
	private ProgressDialog _dialog;

	private String _idPista = null;

¿Cómo se programa en Android?

Android_QR_Code!
captureQRCodeActivity
public void onCreate(Bundle savedInstanceState)
	{
        super.onCreate(savedInstanceState);
        
        Log.v(LOG, "ConectActivity-OnCreate ()");        
        
        // Delete title
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        requestWindowFeature(Window.FEATURE_PROGRESS);
        
        setContentView(R.layout.captureqr);
        
        // Capturamos el Intent y vemos si tiene algun dato para nosotros
        Intent i = getIntent();
        _idPista = getIntent().getStringExtra("pista");
        if (_idPista == null) { 
	        Log.v(LOG, "DATA-STRING: "+i.getDataString());
	        Log.v(LOG, "PARAMETERS: "+i.getData().getQueryParameter("pista"));
	        _idPista = i.getData().getQueryParameter("pista");
        }

¿Cómo se programa en Android?

Android_QR_Code!
captureQRCodeActivity
_pista = (TextView) findViewById(R.id.pista);
        
// Controller
_controller = Controller.getInstace(getApplicationContext());

¿Cómo se programa en Android?

Android_QR_Code!
captureQRCodeActivity
// Manejador de mensajes
        _connector = new MVCViewComponent(_controller)
		{

			public boolean handleMessage(Message msg) 
			{
				// TODO Auto-generated method stub
				Log.v(LOG, "captureQRCodeActivity-Receive What: " + msg.what + " || Obj: " + msg.obj); 

				// Capturamos los mensajes que le interesan a esta interfaz y realizamos las acciones necesarias
				switch (msg.what) {
					case RESPONSE_OK:
						_dialog.cancel();
						_pista.setText((CharSequence) msg.obj);
						return true;
					case RESPONSE_ERROR:
						_dialog.cancel();
						_pista.setTextColor(Color.RED);
						_pista.setText("ERROR Grumete!!");
						Toast.makeText(getApplicationContext(),"Ocurrio un error obteniendo tu pista. Tirar al desarrollador a los tiburones!! Arghhhh!", Toast.LENGTH_LONG).show();
						return true;
				}
				return false;
			}
        	
		};
	}

¿Cómo se programa en Android?

Android_QR_Code!
captureQRCodeActivity
@Override
public void onStart()
{
	super.onStart();

}

@Override
public void onResume()
{
	super.onResume();
	Log.v(LOG, "captureQRCodeActivity-onResume ()");
	super.onResume();

	// Lazamos un dialgo
	_dialog = ProgressDialog.show(this, "", getString(R.string.dialogo), true);

	// Registramos el componente
	_controller.registerMVCComponent(_connector);

	// Mandamos al petición al controlador
	_connector.sendMessage(REQUEST, String.valueOf(_idPista));
}

¿Cómo se programa en Android?

Android_QR_Code!
captureQRCodeActivity
@Override
public void onStop()
{
	super.onStop();
	_controller.unregisterMVCComponent(_connector);
}

¿Cómo se programa en Android?

Android_QR_Code!
Manifest.xml

¿Cómo se programa en Android?

Android_QR_Code!
Manifest.xml

        	
            
            
            
            

       		
        

¿Alguna pregunta?

¡Hora de programar!

¡Muchas gracias por aguantar este tostón!

#