Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 12/06/17, 12:37:55
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Notificaciones en Android

Vereis, tengo una aplicacion la cual le quiero añadir notificaciones, el tema es que no se cual es el mejor metodo para hacerlo cuidando al maximo la bateria del dispositivo, bien sea con notificaciones en la propia app (Service, AlarmManager, etc) o el servicio Firebase de Google?
__________________
Responder Con Cita


  #2  
Viejo 12/06/17, 13:51:42
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Habría que distinguir si hablamos de notificaciones generadas por un servidor (notificaciones push) o si hablamos de mostrar una notificación programada por la app en local a modo de recordatorio.

Para lo primero Google/Firebase Cloud Messaging, para lo segundo el AlarmManager.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #3  
Viejo 12/06/17, 16:12:21
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Pues creo que seria una especie de recordatorio, incluso si la app esta cerrada.
Responder Con Cita
  #4  
Viejo 24/07/17, 21:08:29
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Bueno, ya tengo implementado el sistema de notificaciones y funcionando correctamente. Queria saber ahora es si hay manera de cancelar la alarma al pulsar en el intent que me abre la actividad cuando pulso sobre la notificacion, o es mejor cancelarla por ejemplo cuando se dispara y te mustra la notificacion esperar unos 10,15 segundos y con un Handler cancelarla?
__________________
Responder Con Cita
  #5  
Viejo 24/07/17, 22:00:06
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

No he entendido muy bien a qué te refieres y qué quieres cancelar exactamente.

Las alarmas puedes cancelarlas desde donde quieras, únicamente necesitas construir un Intent igual que el que va a lanzarse y pasárselo al cancel del AlarmManager.

P.D: ¿Has considerado también el caso de que el teléfono se apague y vuelva a encenderse? Hay que establecer las alarmas otra vez porque entre reinicios se pierden
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 24/07/17 a las 22:09:59.
Responder Con Cita
  #6  
Viejo 24/07/17, 23:36:11
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
El boot completed lo he puesto y al apagar y encender el telefono me sigue funcionando el alarmManager si estan activadas las notificaciones, lo que quiero hacer es una vez me haya saltado la notificacion cuando el usuario pulse la notificacion (por defecto abre una activity) se cancele el alarmManager. Las notificaciones las activo y desactivo desde la pantalla de preferencias con un checkbox, luego con un "Calendar" y unas fechas y dias concretos se activa el alarmManager y salta la notification a una hora concreta.
Responder Con Cita
  #7  
Viejo 27/07/17, 12:30:34
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Hay manera de poder cancelar el AlarmManager al pulsar la notificacon o al desplazar a la izda/dcha para borrar la notificacion?
__________________
Responder Con Cita
  #8  
Viejo 27/07/17, 13:56:10
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Tanto al pulsar como al borrar puedes hacer que se llame al intent que quieras (con el contentIntent y el deleteIntent al construir la notificación) y ahí ya cancelas lo que necesites.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 27/07/17 a las 14:38:34.
Responder Con Cita
Gracias de parte de:
  #9  
Viejo 29/07/17, 20:37:41
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Pues no doy con el tema, Tengo el AlarmManager que dispara la notificacion a un dia especifico, ahi todo correcto, la alarma la uso con "PendigIntent.FLAG_ONE_SHOT" (suponiendo que sea esta opcion ) ya que no quiero que se repita hasta otra fecha especifica, ya que quiero que se muestre la misma notificacion pero en diferentes fechas a lo largo del año. La cuestion es si al disparar un alarmManager por ejemplo el dia 24, hay que detener despues la alarma para que se dispare por ejemplo el dia 29?

Tengo una clase "Alarm" con este codigo, que me dispara la notificacion por ejemplo dia 24 a las 18:30 (funciona correctamente), pero la siguiente de dia 29 ya no la muestra, hay que detener la anterior para poder activar otra vez alarmManager?
[php]

public void startAlarm()... // se activa desde ajustes con un checkbox

Calendar calendar = Calendar.getInstance();
...todo lo del calendar aqui...

if (month == Calendar.JULY && diaDelMes == 24 && hour == 18 && min <= 30) {
activarNot(context,calendar);
}
if (month == Calendar.JULY && diaDelMes == 29 && hour == 18 && min <= 30) {
activarNot(context,calendar);
}
... etc mas fechas

// Activar alarmmanager
public void activarNot(Context context, Calendar calendar){
aManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(context, Notificacion.class);
pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_ONE_SHOT);
aManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

ComponentName receiver = new ComponentName(context, AutoStart.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}

// Detener la Alarma
public void stopAlarm(Context context) {
if (aManager != null) {
aManager.cancel(pendingIntent);
}

ComponentName receiver = new ComponentName(context, AutoStart.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}[/php]
__________________
Responder Con Cita
  #10  
Viejo 29/07/17, 20:48:17
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Si quieres activar dos alarmas tienes que asignarle un requestCode de broadcast diferente a cada una. Según está le pasas 0 a todas las alarmas que creas y el PendingIntent para android es como si fuera el mismo, que quizá por eso no se te dispara.

PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_ONE_SHOT);

Ese 0 de ahí tiene que ser diferente para la alarma del 24 y para la del 29 (que siendo un entero puedes pasarle simplemente el 24 o el 29 y así sabes qué pending intent corresponde a cada una rápidamente sin tener que guardar ids ni nada)

Edit: Además no entiendo del código que has puesto, ¿al startAlarm cuándo lo llamas exactamente? Porque según está o programa una alarma o programa otra, pero nunca las dos. Así que cuando salga la del 24 tendrás que programar la del 29 o bien programar las dos a la vez, si no solo tendrás una notificación.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 30/07/17 a las 09:16:46.
Responder Con Cita
  #11  
Viejo 30/07/17, 20:08:13
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Edit: Además no entiendo del código que has puesto, ¿al startAlarm cuándo lo llamas exactamente? Porque según está o programa una alarma o programa otra, pero nunca las dos. Así que cuando salga la del 24 tendrás que programar la del 29 o bien programar las dos a la vez, si no solo tendrás una notificación.
El startAlarm lo activo en las preferencias de la aplicacion, con un checkbox, check = startAlarm, uncheck = stopAlarm.
Intento que en las preferencias al marcar el checkbox me active el alarmmanager, que me funciona correctamente y como tu bien has dicho mocelet, solo me muestra una notificacion.
Resumiendo... activar alarmManager con un "if()" dentro de startAlarm para que me muestre la notificacion en diferentes fechas del calendario.

[php]
if (month == Calendar.JULY && diaDelMes == 24 && hour == 18 && min <= 30) {
activarNot(context,calendar); // solo muestra esta notificacion
}
if (month == Calendar.JULY && diaDelMes == 29 && hour == 18 && min <= 30) {
// aqui crear otro alamrmanager o se puede usar el de dia 24 por ejemplo?
}

//...etc
[/php]
__________________
Responder Con Cita
  #12  
Viejo 30/07/17, 20:45:14
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Sigo sin entender el porqué de esos if. ¿Qué es ese month, diaDelMes, hour y min? ¿La hora actual? ¿Y el calendar que le pasas para la notificación qué es entonces? ¿Es lo mismo?

¿Qué necesidad hay de comparar fechas, horas y minutos si luego la llamada a activarNot es siempre la misma?

Sin conocer más de la app en sí da la impresión que todo eso sobra, lo que tendrás que hacer en el startAlarm es programar las siguientes alarmas que te haga falta programar, con su fecha y su pending intent.

AlarmManager solo hay uno, es un servicio de Android. PendingIntent sí que es posible que tengas que crear varios (con distintos requestCodes si quieres controlar cada uno por separado)
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 31/07/17 a las 07:59:58.
Responder Con Cita
Gracias de parte de:
  #13  
Viejo 31/07/17, 11:58:30
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Bueno ya he conseguido mostrar la notificacion en diferentes horas y dias lanzando la misma notificacion, como tu has dicho mocelet no hay necesidad de comparar fechas, horas y minutos si luego la llamada a activarNot es siempre la misma, por lo que he puesto todo lo relacionado con Calendar en la clase activarNot() con un id diferente en cada una y llamando despues a esta clase sin comparar nada, simplemente poniendo la fecha y la hora que quiero la notificacion.

quedandome ahora asi
[php]
// id pIntent, mes, dia, hora, min, sec
activarNot(context,24,8,24,18,30,0);
activarNot(context,29,8,29,18,30,0);
...etc
[/php]

Otra duda que me queda es acerca de las banderas del pendingIntent, actualmente uso pendingIntent.FLAG_ONE_SHOT, eso quiere decir que se dispara el una vez solo no?, y si uso por ejemplo pendingIntent.FLAG_UPDATE_CURRENT ? se actualizaria la notificacion? por ejemplo en caso de que el usuario no haya borrado la anterior?
__________________

Última edición por kaiser75 Día 31/07/17 a las 12:28:20.
Responder Con Cita
  #14  
Viejo 21/08/17, 12:35:59
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Una pregunta, cuando estableceis una hora y minutos en AlarmManager, es indiferente si por ejemplo la hora es 5 y 5 de la mañana que usariamos?

ponemos 0 o no?
calendar.set(Calendar.HOUR_OF_DAY, 5);
calendar.set(Calendar.MINUTE, 05);

Porque poniendo por ejemplo las 08:05 de la mañana o 8:5 me funciona igual
__________________
Responder Con Cita
  #15  
Viejo 21/08/17, 14:03:06
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

 Cita: Originalmente Escrito por kaiser75 Ver Mensaje
ponemos 0 o no?
calendar.set(Calendar.MINUTE, 05);
Da igual, es un parámetro de tipo int, no es una String.

Cómo lo escribas en el editor da igual, 05 y 5 matemáticamente es el mismo entero y el compilador lo va a tratar como tal. Es como si haces un calendar.set(Calendar.MINUTE, 2 + 3)

Otra cosa sería que usaras los parsers y tuvieras que escribir la hora formateada como String, entonces sí que tendrás que escribir la String de acuerdo a cómo se suele representar la hora, esto es, con dos dígitos para los minutos ("5:05" o "05:05").
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #16  
Viejo 22/08/17, 16:32:02
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Queda claro... Gracias mocelet
__________________
Responder Con Cita
  #17  
Viejo 22/09/17, 12:00:58
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Retomo el post, ya tengo el tema de las notificaciones funcionando correctamente, bueno casi, tengo creadas notificaciones programadas en la aplicacion con AlarmManager y un "BroadcastReceiver" que me reactiva las alarmas al reiniciar o apagar el telefono, el problema que tengo es que por ejemplo con Android 4.0 me funciona perfecto, pero con 6.0, 7.0 no, al apagar el movil y encenderlo de nuevo ya no se activan mas, creo que por problema con Doze, sabeis alguna manera de solucionar el problema?

Uso "aManager.setAndAllowWhileIdle..." para activar la alarma en Android 6.0 y 7.0
"aManager.setExact..." en KitKat
y "aManager.set..." en 4.0 y anteriores
__________________
Responder Con Cita
  #18  
Viejo 20/01/18, 10:35:26
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Vereis, tengo un monton de alarmas que muestran una notificacion en determinadas fechas a la misma hora, al activar las alarmas estas funcionan correctamente, pero el problema es que cuando desactivo las alarmas y volverlas a activar por ejemplo pasados Enero y Febrero, se vuelven a activar correctamente, pero se disparan las alarmas ya pasadas, en este caso Enero y Febrero quedando pendiente la de Abril, como se puede prevenir que no se disparen las alarmas ya pasadas?, comparando el mes y el dia?, me tiene ahi encasquillado .

Este es el codigo para activar las notificaciones
Código:
int hora = 10;
int min = 25

public void start_Al() {
activarNot(context, 1, Calendar.JANUARY, 14, hora, min);
activarNot(context, 2, Calendar.FEBRUARY, 25, hora, min);
activarNot(context, 3, Calendar.APRIL, 18, hora, min);
... etc, asi hasta unas 30 Alarmas que muestran la misma notificacion
}
__________________
Responder Con Cita
  #19  
Viejo 20/01/18, 20:53:35
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

 Cita: Originalmente Escrito por kaiser75 Ver Mensaje
se disparan las alarmas ya pasadas, en este caso Enero y Febrero quedando pendiente la de Abril
En la documentación del AlarmManager indica que si programas una alarma con fecha anterior a la actual se disparará inmediatamente. "If the stated trigger time is in the past, the alarm will be triggered immediately", así que si estás en marzo 2018 no programes las alarmas de enero 2018 y febrero 2018.

Para eso tendrás que comparar las fechas claro. Además, tampoco tiene mucho sentido programar las alarmas de todo el año con antelación, con tener las dos o tres siguientes e ir programando las nuevas cada vez que se notifique una ya basta.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:


  #20  
Viejo 20/01/18, 23:47:33
Array

[xs_avatar]
kaiser75 kaiser75 no está en línea
Miembro del foro
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Gracias por tu respuesta mocelet, antes lo tenia comparando fechas y no funcionaba demasiado bien, aparte de tener mogollon de codigo comparando, activando y desactivando alarmas. Creo que ya lo he solucionado poniendo este pequeño fragmento justo antes de llamar los intents y alarmmanagers, etc , le digo que si la fecha es antes de la actual del dispositivo me añada un dia, asi no me dispara las alarmas pasadas, lo he estado probando hoy en mi movil y funciona correctamente, incluso cuando apagas o reinicias el movil me activa solo las alarmas actuales y no suenan las que ya han pasado.

Código:
if (calendar.before(Calendar.getInstance())) {
            calendar.add(Calendar.DATE, 1);
    }
__________________
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 10:33:10 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /