¿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
- Son ficheros XML
- Todos los componentes tienen que tener definido alto y ancho
¿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
- Ejecutamos la request
// Execute the request and try to decode the JSON Response
long t = System.currentTimeMillis();
HttpResponse response = httpClient.execute(request);
t = System.currentTimeMillis() - t;
Log.d("json-rpc", "Request Package :" + request.toString());
Log.d("json-rpc", "Request time :" + t);
Log.d("json-rpc", "URL :" + serviceUri + methodUri);
Log.d("json-rpc", "Params :" + jsonRequest);
String responseString = EntityUtils.toString(response.getEntity());
responseString = responseString.trim();
Log.d("json-rpc", "response: "+responseString);
Log.d("json-rpc", "----------------------------------------------------------------------------------");
JSONObject jsonResponse = new JSONObject(responseString);
// Check for remote errors
if (jsonResponse.has("error"))
{
Object jsonError = jsonResponse.get("error");
if (!jsonError.equals(null))
throw new JSONRPCException(jsonResponse.get("error"));
return jsonResponse; // JSON-RPC 1.0
}
else
{
return jsonResponse; // JSON-RPC 2.0
}
¿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
¡Muchas gracias por aguantar este tostón!
←
→
#