PDA

Ver la Versión Completa : Notificacion barra de estado


Xasti
23/06/15, 13:10:04
Hola, y gracias de antemano, estoy desarrollando un sistema de seguridad para casa con una placa de arduino y lo controlo con una aplicación android que estoy haciendo yo también, ya he conseguido a través de la aplicación tener control de todos los sensores pero no soy capaz de hacer que mi aplicación me mande una notificación a la barra de tareas cuando se activa la alarma. Para ello lo que hago es convertir el html donde esta la información del estado del pin de alarma a un string y este compararle con el texto que deberia haber si la alarma esta activada, para ello uso este codigo:


public String convertirAstring() {
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://192.168.1.134/arduino/digital/13");

try {
HttpResponse response = client.execute(httpGet);

StatusLine statusLine = response.getStatusLine();

int statusCode = statusLine.getStatusCode();

if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));

String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
}

} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}



public void comprobar(){
String texto = convertirAstring();
String alarma = "Pin D13 set to 1";

if (texto.equals(alarma)) {
lanzamosNotificacion();
}

}

Y el codigo que tengo para la notificación es este:

public void LanzamosNotificacion(){

NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);

int icon = R.drawable.ic_launcher;

CharSequence Text = "La alarma ha sido activada!!.";

CharSequence texto_1 = "Notificación de alarma";

CharSequence texto_titulo = "Alarma!!!!";

long when = System.currentTimeMillis();

Notification notification = new Notification(icon, texto_1, when);

Intent notificationIntent = new Intent(getApplicationContext()
,MainActivity.class);

PendingIntent contentIntent = PendingIntent.getActivity(this,
0, notificationIntent, 0);

notification.setLatestEventInfo(getApplicationCont ext(), texto_titulo,
Text, contentIntent);

notificationManager.notify(1, notification);
}


Lo cierto es que no soy ningún experto, de hecho todo lo contrario y no soy capaz de hacer que funcione, he intentado hacerlo funcionar con AsyncTask pero no consigo que cuando se activa la alarma haga nada.

Si alguien me pudiera echar una mano estaría muy agradecido.

Un saludo.

Xasti
23/06/15, 18:57:15
Ya he conseguido que lo compruebe y lance la notificación pero solo al inicio del programa, me gustaría saber si hay algún método o alguna forma que realice la comprobación por ejemplo cada segundo, es decir como puedo ejecutar el método que comprueba si la alarma ha saltado cada segundo (ya esta en un hilo diferente ejecutándose).

kriogeN
23/06/15, 21:13:48
Ya he conseguido que lo compruebe y lance la notificación pero solo al inicio del programa, me gustaría saber si hay algún método o alguna forma que realice la comprobación por ejemplo cada segundo, es decir como puedo ejecutar el método que comprueba si la alarma ha saltado cada segundo (ya esta en un hilo diferente ejecutándose).

Es algo bastante amplio como para explicar si no tienes conocimientos profundos de como gestiona Android las aplicaciones. Por puntos:

1) Los hilos de una app en Android sólo funcionan al 100% si la app está en primer plano, si pasa a segundo plano pueden morir.

2) Para asegurar que un proceso en segundo plano funcione al 100% debe ejecutarse en un servicio, y además ese servicio ser de tipo START_STICKY, es decir, que si se muere el sistema automáticamente lo vuelva a relanzar.

3) Cuando apagas la pantalla del móvil el sistema puede entrar en modo SLEEP, y en ese modo incluso los servicios dejan de funcionar.

4) Para poder ejecutar código en modo SLEEP debes de adquirir un WAKE_LOCK, que hace que hasta que no lo liberes el móvil no pueda entrar en modo SLEEP.

5) Obviamente lo anterior hace que el móvil se funda la batería, así que si vas a hacerlo así lo mejor es acompañarlo con una alarma, para que lo haga cada X tiempo en lugar de continuamente. Obviamente cuanto menor sea el periodo de tiempo más tiempo estará el móvil sin entrar en modo SLEEP y menos durará la batería.

6) Lo único que se ejecuta si o si aunque el móvil esté en modo SLEEP es una entrada de una notificación Push.

Así que con todo esto, te explico lo mejor para tu caso:

Que sea el Arduino el que compruebe el estado continuamente, y cuando salte la alarma envíe una notificación Push al móvil.

Xasti
24/06/15, 11:45:22
Gracias por la contestación, al final conseguí hacerlo metiendo un Timer que ejecute el código de comprobación cada segundo y funciona a la perfección, muchas gracias de todas formas

kriogeN
24/06/15, 15:43:07
Gracias por la contestación, al final conseguí hacerlo metiendo un Timer que ejecute el código de comprobación cada segundo y funciona a la perfección, muchas gracias de todas formas

Usar Timer es una de las peores cosas para una aplicación que quieres ejecutar completamente en segundo plano. Es casi como usar AlarmManager pero dependiente de la app en lugar de dependiente del Kernel.

Es casi como lo que te he dicho en el punto 5 de mi anterior post, sólo que yo me refería al AlarmManager. Pero si te funciona con el Timer en tu móvil, perfecto.

Eso si, haz la siguiente prueba. Deja el móvil completamente dormido y luego fuerza que tenga que llegar la notificación. Si llega, perfecto. Si no llega ya sabrás porque es mejor usar AlarmManager. Aunque con 1 segundo no se ni siquiera si le dará tiempo al móvil a dormirse.

Sea como sea, sigue siendo un funde baterías.