martes, 30 de diciembre de 2014

La bella dama con ojos de porcelana

Hoy les traigo unas letras de mi puño y letra :



Quiero recordar la imagen de una bella dama, con ojos de porcelana , sin lagrimas ni penas, ella me iluminaba... cuidando de mi como un ángel de la guarda, en sus alas yo me acurrucaba.
En la vida hay que ser valiente y nadar contra corriente.
Es difícil recordar el rostro de aquella dama, tanto tiempo a pasado y aun no se nada, de mi preciosa dama.
En la vida hay que ser valiente y nadar contra corriente.
Nunca estoy solo, siempre te tengo presente en mente, con cariño recuerdo esos besos en la frente.
En la vida hay que ser valiente y nadar contra corriente.
Donde está mi dulce dama ? Algún día la veré, aunque solo sea un instante, suficiente para refrescar el recuerdo de mi mente.
En la vida hay que ser valiente y nadar contra corriente.
Ya estoy acostumbrado, no hace falta que me diga nada, no hace falta que este presente, sé lo mucho que me quiere.
En la vida hay que ser valiente y nadar contra corriente.
"Ionut Mihai Vladasel"




Enlace a la la version de google plus: plus.google.com/

domingo, 9 de noviembre de 2014

JavaScript

He aquí el JavaScript de DAW 


ctivitat núm. 2

Bloc 3 - Bucles

1.El factorial d'un nombre enter n és una operació matemàtica que consisteix a multiplicar tots els factors n x (n-1) x (n-2) x ... x 1. Així, el factorial de 5 (escrit com 5!) És igual a: 5! = 5 x 4 x 3 x 2 x 1 = 120 Utilitzant l'estructura for, crear un script que calculi el factorial d'un nombre enter.

var m = window.prompt("entra un numero :")
var suma=1;
for(n=m; n>1; n--) {
suma= suma * (n*(n-1))
n=n-1
}
window.alert(m+"! = "+suma)

2.Sol·licitar amb un prompt un nom, i després un nombre de repeticions.Imprimir en pantalla el nom  tantes vegades com indica el nombre de repeticions.

var nom = window.prompt("dame tu nombre ")
var repet = window.prompt("dime cuantas veces quieres que te lo repita ")
var str="\n"
while(repet>0)
{
str=str+nom+"\n"
repet--
}

3. Imprim ir els primers 100 números senars, exceptuant tots els que pertanyen a la desena del 50 (es a dir: 51, 53, 55, 57 i 59).

var str=""
for(i=1; i<100; i++)
{
if(i==50) i=60
if(i%2!=0)
str=str+","+i
}
window.alert(str)

4. Anar demanant números fins que entrin el zero, en aquest moment calcular la mitja aritmètica dels nombres entrats.

var suma=0;
var nums=0;
do{
var n = parseInt(window.prompt("dame un numer! (cero para salir)"))
if(n!=0 && !isNaN(n)){
suma=suma+n
nums++
}
}while(n!=0)
window.alert("has entra "+nums+" numeros y la media
es :"+Math.round(suma/nums,3));


5. Supose m que per qualsevol motiu, el nostre ordinador no sap fer l’operació multiplicar, feu un  programa que demani dos números i retorni el seu producte, sense fer servir l’operador * (feu servir sumes successives).

do{ var a = parseInt(window.prompt(" dame un numero ") )
}while(isNaN(a))
do{ var b = parseInt(window.prompt(" dame otro y lo multiplico con el
anterior" ))
}while(isNaN(b))
var suma=0
for(i=a; i>0; i--)
suma=suma+b
window.alert(a+"*"+b+"="+suma)

6 . Igual a l’anterior però amb la divisió , ha de retornar la part entera de dividir
el més gran entre el més petit i el residu

do{ var a = parseInt(window.prompt(" dame un numero ") )
}while(isNaN(a))
do{ var b = parseInt(window.prompt(" dame otro numero!" ))
}while(isNaN(b))
if(a>b){
var gran=a
var petit=b
}else{
var gran=b
var petit=a
}
var g2=gran
var p2=petit
for(i=0; gran>=petit; i++)
gran=gran-petit
window.alert(g2+"/"+p2+"="+(i))

7. Feu un programa en JavaScript que faci una pregunta qualsevol amb la instrucció prompt, i que tot seguit informi del número de milisegons que ha trigat l’usuari en contestar -la. (Pista, captura els milisegons abans i de sprés  de la pregunta i calcula la diferència).


window.alert("estas preparado?")
var d = new Date();
var n = parseInt(d.getMilliseconds());
var respuesta = window.prompt("hola")
var d2 = new Date();
var n2 = parseInt(d2.getMilliseconds());
var temp = n2-n
if(temp<0)
temp=-1*temp
window.alert("has tardando en contestar "+temp+" milisegundos")

8 . Demana mitjançant prompt la data de naixement d’una persona i calcula la seva edat real.

var anio =window.prompt("dime el año en que naciste (yyyy)")
var mes = window.prompt("dime el mes en que naciste (mm)")
var dia = window.prompt("dime el dia en que naciste (dd)")
window.alert("ahora voy a hacer magia y adivinaré que edad tienes!")
var date1 = new Date(anio, mes, dia)
var date2 = new Date()
var dias = parseInt((date2 - date1) / (1000 * 60 * 60 * 24))
var tus_a = parseInt(dias/365)
var tus_m = parseInt((dias%365)/30)+1
var tus_d = parseInt((dias%365)%30)+1
window.alert("tu tienes (mas o menos) "+tus_a+" años "+tus_m+" mese y
"+tus_d+" dias ")


9. Feu un programa en JavaScript que es pensi un número entre 1 i 100. Tot seguit ha de demanar a l’usuar i que entri un número, si no l’encerta se li informa si s’ha passat o s’ha quedat curt i li torna a demanar un altre. El programa acaba quan s’encerti el número. En aquest moment s’ha de felicitar
a l’usuari i comunicar – li el número d’intents que ha necessitat per encertar - lo. Haureu d’utilitzar molts dels coneixements estudiats fins ara: bucles, condicions, instruccions prompt i alert, operadors, el mètode Math.random... var num = Math.round(Math.random()*100);


var intentos = 0
var salir=false
window.alert("vamos a jugar a un juego, yo pienso en un numero y tu tienes
que acertar! si?")
window.alert("Estoy pensando en un numero...... dame un segundo !")
do{
window.alert("Vale ya lo tengo !!!");
var str="Entra un numero de 0 a 100 "
do{
var intento = window.prompt(str)
if(intento<num)
str=" Sube !!!"
else
str=" Baja !"
intentos++
}while(intento!=num)
window.alert("Felicidades lo has acertado!!!!\nEl numero es "+num+", y en
solo "+intentos+" intenteos")

var op = window.prompt("quieres volver a jugar? \n 1. Si \n 2. No ")
if(op==2 || op == "no" || op =="No" || op=="NO")
salir=true
}while(!salir)
window.alert("Este juego es entretenido, pasate por aqui cuando quieras, un
saludo!")

10.Feu un programa que demani una frase i que mostri per pantalla totes les vo cals que conté (tant majúscules com minúscules). 


var text = window.prompt("oye tu, entra un texto en la caja de abajo !")
text = text.toUpperCase();
var a=0;
var e=0;
var i=0;
var o=0;
var u=0;
for(x=0; x<text.length; x++)
{
switch(text.charAt(x))
{
case 'A':
case 'a':
a++
break;
case 'E':
case 'e':
e++
break;
case 'I':
case 'i':
i++
break;
case 'O':
case 'o':
o++
break;
case 'U':
case 'u':
u++
break;
}
}s
tr =" a: "+a+"\n e: "+e+"\n i: "+i+"\n o: "+o+"\n u: "+u;
window.alert("en el texto '"+text+"' se encuentran las siguientes vocales
\n"+str)

11 . Feu un programa que demani una frase i que la mostri escrita al revés. 

var str = window.prompt("entra tu mejor frase para ligar :")
window.alert("Esto es lo que entiende los demás: "+str.split('').reverse().join(''))


12 . Feu un programa que demani una frase i que digui si és un palíndrom. Un palíndrom és una frase que es llegeix igual d’esquerra a dreta que de dreta a esquerra (normalment sense tenir en compte els signes d’interrogació, de puntuació ni els accents), Exemple:  Meló verd, net i tendre, volem . O la ballarina Sara Varas

var str = window.prompt("entra una frase, a ver si es palindrom")
str = str.replace(/\s/g ,'')//quitar los espacios
str = str.toUpperCase()
str = str.replace(/(,*)(\.*)(\'*)(\-*)/g,'')
str = str.replace(/Ó+/g,'O')
if(str==str.split('').reverse().join(''))
window.alert(str+"\n--- SI es palindrom ---")
else
window.alert(str+"\n---NO es palindrom--")


13. Feu un programa que demani una frase i que escrigui la sum a de tots els dígits numèrics que contingui, per exemple Tarragona 2017 escriurà: 10 (2+0+1+7), si no en té cap escriurà zero

var str_v1 = window.prompt("dame una frase")
str=str_v1.split('')//convertir en array
var suma=0;
for(i=0; i<str.length; i++)
if(!isNaN(parseInt(str[i])) && isFinite(parseInt(str[i])))
suma = suma + parseInt(str[i])
window.alert("en la frase '"+str_v1+"' la suma de los digitos es : "+suma)
















lunes, 20 de octubre de 2014

Turorial Django un lunes por la tarde

Hola, hoy lunes por la tarde me apetecía escribir en el blog y puesto que estoy con Django y python me he decidido escirbir una entrada en el blog.

Antes de empezar, asumo que ya tienes instalado Django.


Como crear un proyecto web con Django, en la consola escribimos:

 " django-admin.py startproject nomSitioWeb" 

domingo, 18 de mayo de 2014

DBOR , colección de datos en SQL , VARRAY en Oracle

Oracle permite almacenar colecciones de datos del mismo tipo, de esta manera es posible almacenar en un vector (varray) o en forma de tabla anidada.

El tipo VARRAY  es un conjunto ordenado de elementos del mismo tipo, cada elemento tiene asociado un index. Los varray pueden tener longitud variable aunque es necesario establecer una longitud inicial.

1. Creamos el tipo de array :
create or replace type agenda_t as varray(3) of varchar2(20);

2. Un objeto que utilice el array "agenda_t" :
create or replace type homero as object(id_h number(2), mi_agenda agenda_t );

3. Una tabla para almacenar los objetos "homero":
create table homero_tab of homero ;

4. Insertamos un "homero" en la tabla "homero_tab":
insert into homero_tab values(1, agenda_t('3','2','1'));


5. Visualizar los datos almacenados:
select * from homero_tab;

otra forma de obtener los datos:
select value(m) from homero_tab m;

IMPORTANTE:  con el lenguaje SQL solo se pueden recuperar las listas (arrays) como un bloque, no se puede acceder a los datos de forma individual, para eso es necesario utilizar  PL/SQL 

Ejemplo de como recorrer la lista anterior : 
1.  set serveroutput start;  /*para poder imprimir por consola*/

2. 
declare
     lista homero;
     indice PLS_INTEGER;
begin
          select value(v)into lista from homero_tab v;
          indice := lista.mi_agenda.first;
          while(indice is not null) loop
                DBMS_OUTPUT.PUT_LINE('valor :' || lista.mi_agenda(indice)|| ' en indice :'||indice);
               indice := lista.mi_agenda.next(indice);
          end loop;
end;











DBOR, referencia entre objetos SQL

Cada objeto en una tabla tiene un identificador (id) , nosotros podemos definir atributos en una clase que sean una referencia a un objeto de otra tabla, de esta forma se puede implementar las relaciones entre tablas que almacenan objetos.

Oracle utiliza el operador "REF" , que devuelve el id de los objetos de una tabla de objetos. Un atributo de tipo "REF" guarda la referencia a un objeto del tipo definido e implementa una relacion entre los dos tipos de objetos. Esta referencia permite acceder a los objetos referenciados y modificar la información , pero no se puede operar directamente sobre la referencia. (dicho con otras palabras, no es un puntero) .


Explicacion para tontos:
Tienes una tabla A que guarda objetos A, y una tabla B que guarda objetos B,  en la clase A tienes un atributo que hace referencia a un objeto B , pero no necesariamente tiene que existir dentro de la tabla B.

entonces , si quieres que en la tabla A solo se guarden objetos con referencia a objetos B , QUE SÍ EXISTEN,  y se guardan en la tabla B, tienes que especificarlo con el operador "SCOPE" ,  de esta forma se evita guardar espacio en memoria para un ipotetico objeto B que aun no existe en la tabla B.


El siguiente ejemplo muestra como se restringe que dentro de la tabla B solo se puedan añadir objetos que  sí existen dentro de la tabla A

Ejemplo :
CREATE TYPE  obj_A  AS OBJECT( .... .... .... ); /* Clase  A*/

CREATE TABLE    tab_A    OF    obj_A;

CREATE TYPE   obj_B   AS OBJECT (     /* Clase  B*/
             ordnum NUMBER,
             cliente    REF   obj_A,
             fechpedido DATE,
             direcentrega direccion_t);

CREATE TABLE    tab_B    OF obj_B  (
             PRIMARY KEY (ordnum),
             SCOPE FOR (cliente) IS tab_A);
);



PROBLEMA :  al borrar un objeto de la tabla  A , en la tabla B los objetos aun mantienen la referencia al objeto borrado, y al hacer un select , Oracle muestra un error de referencia colgada (dangling references)
, para evitar esto se pude deshacer la referencia con "DEREF", pero  la solución más facil es hacer esa referencia que sea una clave externa (foreign key) . La tabla B quedaría de esta forma:
CREATE TABLE    tab_B    OF obj_B  (
             PRIMARY KEY (ordnum),
             FOREIGN KEY  (cliente) REFERENCES  tab_A,
            ON DELETE CASCADE    /*si se borrar un objeto A se borran todos los B que estén relacionados */
);





























DBOR ordenar y comparar objetos en SQL

Para poder ordenar o comparar objetos en Sql se utilizan las claves "MAP" y "ORDER".

Oracle es incapaz de deducir si un objeto es mayor que otro, por lo tanto , es necesario implementar una de estas funciones (solo se puede implementar una o la otra, no ambas a la vez)

MAP, nos sirve para comparar objetos y es llamado automaticamente cuando en un  SELECT  se utiliza DISTINCT, ORDER BY  y GROUP BY.

Ejemplo, creamos un objeto "melonT":

CREATE OR REPLACE TYPE melonT AS  OBJECT
(
id_melon number(2);
nombre  varchar2(20);
MAP MEMBER FUNCTION id_melon  RETURN NUMBER;  /*cabecera del metodo 'id_melon  ' */
);

/* creamos el metodo 'id_melon  ' */

CREATE OR REPLACE TYPE BODY melonT   AS
      MAP MEMBER FUNCTION id_melon  RETURN NUMBER
      BEGIN
            RETURN id_melon;   /*return: un atributo que sea clave primaria */
      END;
END;
----------------------------------------------------

ORDER , a diferencia de MAP  , solo puede comparar la diferencia entre  2 objetos y la sintaxis es más estricta. El resultado de "ORDER"  tiene que ser un valor que se pueda comparar (un tipo primitivo), el retorno de la función es la resta del valor del propio objeto menos el valor del objeto pasado por parametro, es decir, si la salida es cero los dos objetos son son iguales, si la salida es negativa el objeto que es comparado es más pequeño y si la salida es positiva el objeto a comparar es mayor el objeto con el que se compara.


Ejemplo :

CREATE OR REPLACE TYPE melonT AS  OBJECT
(
id_melon number(2);
nombre  varchar2(20);
ORDER MEMBER FUNCTION equals(otroObj   IN  melonT ) RETURN INTEGER;  /*cabecera del metodo 'equals' */
);

CREATE OR REPLACE TYPE BODY melonT   AS
      MAP MEMBER FUNCTION equals(otroObj   IN  melonT )  RETURN INTEGER
      BEGIN
            RETURN  id_melon -  ortroObj.id_melon;
      END;
END;










DBOR Bases de Datos Objecte-Relacionals



Instrucciones basicas en SQL para la creación de objetos y tablas de objetos:

Comentario de texto en SQL se hace con 2 guiones "--" al pricipio de la linea!

1. crear un objeto
-- Para heredar de un objeto creado, se le tiene que especificar "NOT FINAL" .

CREATE OR REPLACE TYPE nom_objeto AS OBJECT (
           atributo1  VARCHAR2(123)  [, atributo2  NUMBER(2) ] [ ,atributo3 DATE] ,
           MEMBER FUNCTION getAtributo1 return VARCHAR2,
           MEMBER PROCEDURE setAtributo1(nuevoValor  VARCHAR2),
           
)  NOT FINAL  ;

Ejemplo, heredar del objeto "nom_objeto":

CREATE OR REPLACE TYPE nom_objeto2  UNDER  nom_objeto  (
--atributos
--declaración de metodos
);


2. definir los metodos de cada objeto creado :

CREATE OR REPLACE TYPE BODY  nom_objeto AS 

     MEMBER FUNCTION getAtributo1 RETURN VARCHAR AS 
          --entre "as" y "begin" inicializar variables de esta funcion, si hace falta.
          BEGIN
               RETURN SELF.atributo1;
          END getAtributo;


     MEMBER PROCEDURE setAtributo1(nuevoValor   VARCHAR2)  AS 
          BEGIN
               SELF.atributo1 : =  nuevoValor ;
          END setAtributo;
END;


3. Crear tabla de este objeto :


CREATE TABLE nomTabla OF nom_objeto( PRIMARY KEY(atributo1));

INSERT INTO nomTabla VALUES('valor del atributo1 del objeto' );
INSERT INTO nomTabla VALUES('hola ' );
INSERT INTO nomTabla VALUES('mundooo ' );



SELECT * FROM nomTabla  T  WHERE  T.atributo1 = '   hola  '  ;

result :

ATRIBUTO1
---------------------------------------------------
hola                                                              

La función VALUE  sirve para obtener la misma estructura del tipo de objeto de una tabla. En un select normal se obtiene los valores de los atributos, mietras que utilizando la funcion value() se obtiene el objeto entero .

SELCET  VALUE(P) FROM  nomTabla P ;

result:

VALUE(P)
---------------------------------------------------
SYSTEM.ATRIBUTO1(' valor del atributo del objeto ')     
SYSTEM.ATRIBUTO1(' hola')     
SYSTEM.ATRIBUTO1(' mundo  ')    




    














martes, 15 de abril de 2014

Core Data en Xcode

Pasos a seguir para crear un proyecto con la configuración para utilizar Core Data 

  1. New > project > Aplication > empty application > Next > seleccina "use coreData".
  2. Crear el storyBoard : new > file > user interfaces > story board. Ir a la raiz del proyecto y seleccionar en "developer info " > " Main interfaces" selecciona con el desplegable el storyboard. Ir a "appdelegate.m" y en el metodo "application:(UIAplicatio *) application didFinishLaunchingWithOptions:(NSDirectionary *) launchOptions " borrar todo y agregar SOLO "return YES;"
  3. En el archivo XXXX.xcdatamodel abajo a la derecha esta el icono de "editor style", cambiamos a modo "table grap" (editar las tablas de forma visual)
  4. Abajo a la izquierda en "add empty" añadimos una entidad (tabla)
  5. En la derecha vista "Utilidades" en "data model inspector" editamos la tabla. (nom, agregar property con su respectivo tipo... etc.)
  6. agregar relaciones entre las tablas : cambias el tipo de vista para las tablas, seleccionas la entidad, en "relationShip" con el boton de añadir "+" agregamos una relacion con su nombre, origen , destino (en todas seleccionas la inversa) . Selecciona la relacion (haciendo clic encima para que este en azul) y en la derecha en "type" selecciona "to many " en caso que sea una relacion uno a muchos. (explicacion para tontos: en la entidad con la relacion 1 (uno) tiene que tener una flecha, en la entidad con la relacion n (muchos) tiene que tener 2 flechitas. )
  7. Crear las clases ".h", ".m" de cada entidad: seleccionas las clases en modo "visual" (que se vean las tablas) , en la parte izquierda de la pantalla en "EMPTIES" , luego New File > CoreData > NSManagerObject Subclass. > next > next

lunes, 17 de marzo de 2014

Table View en Android



La finalidad de este tutorial es poder mostrar en un Activity una lista con las celdas personalizadas .

Puntos importantes : 
1. La activity que gestiona los eventos y su layout.xml (tipo de layout que se desea y dentro un listView)
2. La lista (arrayList) que se mostrará en un ListView
3. Una clase Item que es el objeto que corresponde a cada celda de ListView
4 Un Item_Layout , un layout para el item, aqui se define el diseño de cada celda de ListView.
5. Una clase.java (adapter) para adaptar la  "lista" (que es un array list de toda la vida)  a la listView

--------------------------------------------------------------------------------------------------------

    Dicho esto, ya podemos empezar  !

1. Crear el Activity (.java)  con su vista (.xml)  y declararlo en "AndroidManifest.xml"  



si todas las clases están en el mismo paquete funciona con el "." (punto), si las clases
están en paquetes diferentes tienes que poner todo el nombre del paquete y nombre de clase
ejemplo: com.example.listas.ListaCompras
ejemplo de otro posible paquete: com.example.activitys



2.1.   Declaramos el objeto  "listaView"  dentro de la clase ListaCompras, y lo inicalizamos en el metodo "onCreate" de lamisma clase: 
    



2.2.  En este ejemplo creamos una simple lista de ejemplo, pero en una App comercial los datos se pueden recuperar de sqlite o un archivo XML. 



     
3.  En este caso creamos una case propia "Mi_Item.java" para poder guardar objetos como "un libro" con sus atributos: nombre, autor, precio, nº de edicion etc. Esto en un futuro podremos  reciclar el codigo con coco esfuerzo.  En caso que solo quieres una lista simpre se puede utilizar el tipo de "Item" o "celda" predeterminada por android "android.R.layout.simple_list_item_1".  http://developer.android.com/guide/topics/ui/layout/listview.html

Se omiten los getters y setters, tienes que ponerlos!



resumen del punto 3: esta clase "mi_item" es solo un objeto que se mostrará en cada celda de la lista.

4.   Creamos la vista personalizada de cada celda (es un layout de toda la vida solo que se repetirá , se puede incluir incluso fragments y dentro más vistas y vistas y botones y spinners y todo lo que quieras xd )


New>Others>Android XML layout

res / layout / mi_item.xml

5. Creamos el adaptador (una clase.java)  extendida de BaseAdapter para poder adaptar la lista de Strings a una ListView:

creamos la clase "Mi_ItemsAdapter.java" extendida de Base Adapter y con los metodos obligatorios que los requiere la clase padre .

Creamos el constructor y los atributos "context" y "items" :


Los Getters and Setters son obligatorios !!! 


Sobreescribimos los metodos :


@Override
public int getCount() {
return items.size();
}

@Override
public Object getItem(int posicion) {
return items.get(posicion);
}

@Override
public long getItemId(int position) {
return position; //este metodo no lo entiendo
}

@Override
   public View getView(int position, View convertView, ViewGroup parent) {
 
       View rowView = convertView;

       if (convertView == null) {
           // Create a new view into the list.
           LayoutInflater inflater = (LayoutInflater) context
                   .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           //para cada fila infla este tipo de item
           rowView = inflater.inflate(R.layout.mi_item, parent, false);
       }
 
       // Set data into the view.
       
       TextView textoIzquierda = (TextView) rowView.findViewById(R.id.textViewIzquierda);
       TextView textoCentral = (TextView) rowView.findViewById(R.id.textViewCentral);
       //CheckBox cb= (CheckBox) rowView.findViewById(R.id.checkBoxDerecha);
 
       Mi_Item itemSeleccionado = this.items.get(position);
       
       textoIzquierda.setText(itemSeleccionado.getCantidad());
       textoCentral.setText(itemSeleccionado.getDescripcion());
      //cb.setSelected(false);
       return rowView;
   }

// + getters and setters....

Solo queda asignarle este adaptador al ListView de la clase ListaCompras.java  y agregar un escuchador del listView

ListaCompras.java


Si todo a salido bien .. y con un par de modificaciones en el diseño de la vista, obtenemos este resultado :

Captura de pantalla




Y listo ! solo queda ejecutar el programa... por si lees esto y estas perdido... se omite la creacion de proyecto y de la clase principal "MainActivity.java". Si no se entiende el tutorial contacte con https://www.facebook.com/ionut.vladasel 










viernes, 7 de marzo de 2014

BroadcastReceiver en Android

    Un BroadcastReceiver tiene como finalidad indentificar eventos globales que pasan dentro del sistema operativo Android, por ejemplo: recibir un SMS, identificar una llamada entrante, el estado de la bateria, identificar si se cambia de tarjeta SIM... etc. en resumen cuando sucede alguna de las acciones mencionadas anteriormente el OS envia un "mensaje" a todas las Apps.

  Cuando sucede un envento global, el sistema operativo Android se encarga de crear el objeto bradcast y al finalizar la ejecucion de su codigo se destruye el objeto. Esto a diferencia de un servicio permite ahorrar bateria, cabe mencionar que un broadcast está diseñado solo para acciones que requieren poco codigo.


Para recordar:

1. Tienes que registrar el boadcast en AndroidManifest.xml y el sistema se encarga de desencadenarlo y gestionarlo.

<reciver android:name=".NombreClaseBroadcastReciver">
<intent-filter>
<action android:name="android.     accion que se desea controlar      ">
</intent-filter>
</reciver>

2.  Se puede registrar en tiempo de ejecución a través del metodo "registerReceiver" de la clase "Context".

3.  Carece de interfaz  de usuario.


El codigo se ejecuta en el metodo "onReceive".


EJEMPLO :

public class SMS extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

/*
* las acciones se guardan en el parametro "intent"
*/
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
/*
* accion a realizar en caso de recibir un SMS
*/

}
}

}


Que no se te olvide pedir los permisos para recibir SMS
<uses-permission android:name="android.permission.RECEIVE_SMS"/>