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 31/12/15, 12:33:53
Array

[xs_avatar]
_DeV_ _DeV_ no está en línea
Usuario poco activo
 
Fecha de registro: nov 2011
Mensajes: 45
Tu operador: Movistar

Notificaciones activas aunque el telefono se reinicie.

Buenas!

Os comento, en mi app cada día a una hora X debe saltar una notificación. He conseguido que la alarma suene a la hora que yo quiera y en los intervalos de tiempo que yo quiera, por ejemplo:

Son las (por poner un ejemplo) 10:30, configuro la notificación a las 10:35 y que notifique en intervalos de 2 min. Por lo tanto ejecuto la app y a los 5 min me salta la notificación y luego cada dos minutos. Todo perfecto, sigue sonando aunque cierre la app y aunque bloquee el movil.

El problema viene cuando apago el móvil y lo vuelvo a encender, la notificación quiero que siga saltando pero ya no salta más.

Cómo puedo solucionar eso? Os enseño código que tengo:

MainActivity.java tengo una función alarma que se llama cada vez que se abre la app:

[php]

private void alarm(){

Calendar c = Calendar.getInstance();
c.setTime(new Date());
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
AlarmsDB al = new AlarmsDB(getApplicationContext());

if(al.alarmDay(dayOfWeek)) { //If today the user want the alarm, we set it. If not, nothing happens
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent alarmIntent = new Intent(this, AlarmReceiver.class); // AlarmReceiver1 = broadcast receiver

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmIntent.setData((Uri.parse("custom://" + System.currentTimeMillis())));
alarmManager.cancel(pendingIntent);

Calendar alarmStartTime = Calendar.getInstance();
Calendar now = Calendar.getInstance();
alarmStartTime.set(Calendar.HOUR_OF_DAY, 10);
alarmStartTime.set(Calendar.MINUTE, 35);
alarmStartTime.set(Calendar.SECOND, 00);

if (now.after(alarmStartTime)) {
Log.d("Hey", "Added a day");
alarmStartTime.add(Calendar.DATE, 1);
}

switch (al.alarmHowManyDaysNext(dayOfWeek)){//We decide when the alarm will ring again.
case 1: //In 1 day
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pendingIntent);
break;
case 2: //In 2 days
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), (AlarmManager.INTERVAL_DAY * 2), pendingIntent);
break;
case 3: //In 3 days
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), (AlarmManager.INTERVAL_DAY * 3), pendingIntent);
break;
case 4: //In 4 day
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), (AlarmManager.INTERVAL_DAY * 4), pendingIntent);
break;
case 5: //In 5 day
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), (AlarmManager.INTERVAL_DAY * 5), pendingIntent);
break;
case 6: //In 6 day
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), (AlarmManager.INTERVAL_DAY * 6), pendingIntent);
break;
case 7: //In 7 day
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), (AlarmManager.INTERVAL_DAY * 7), pendingIntent);
break;
default: //In 1 day -- to hang errors.
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
break;
}
Log.d("Alarm", "Alarm set, next will ring in " + al.alarmHowManyDaysNext(dayOfWeek) + " days.");
}
}[/php]Luego está la clase AlarmReciever que se encarga de recibir y lanzar la notificación:

[php]public void onReceive(Context context, Intent intent) {
Notification(context,"Menú del día disponible, consúltalo.");
}

public void Notification(Context context, String message) {

// Create Notification using NotificationCompat.Builder
NotificationCompat.Builder builder = new NotificationCompat.Builder(
context)
// Set Icon
.setSmallIcon(R.drawable.ic_app)
// Set Ticker Message
.setTicker(R.string.titlenot)
// Set Title
.setContentTitle(R.string.textnot)
// Set Text
.setContentText(message)
// Add an Action Button below Notification
//.addAction(R.drawable.ic_app, "Action Button", pIntent)
// Set PendingIntent into Notification
//.setContentIntent(pIntent)
// Dismiss Notification
.setAutoCancel(true)
// Set vibration
.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });

// Create Notification Manager
NotificationManager notificationmanager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
// Build Notification with Notification Manager
notificationmanager.notify(0, builder.build());

Log.d("AlarmReceiver", "Alarma sonando, son las: " + new Date());

}[/php]A ver si me podéis echar una mano con esto, muchas gracias!

Un saludo!
Responder Con Cita


  #2  
Viejo 31/12/15, 15:38:41
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Tienes que usar un BroadcastReceiver que filtre la acción BOOT_COMPLETED. También necesitas establecer el permiso RECEIVE_BOOT_COMPLETED. Y en el código estableces la configuración del AlarmManager.

El código se ejecutará cuando el móvil termine de reiniciarse y se hayan puesto en marcha todos los servicios del sistema.
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 01/01/16, 12:47:29
Array

[xs_avatar]
_DeV_ _DeV_ no está en línea
Usuario poco activo
 
Fecha de registro: nov 2011
Mensajes: 45
Tu operador: Movistar

 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Tienes que usar un BroadcastReceiver que filtre la acción BOOT_COMPLETED. También necesitas establecer el permiso RECEIVE_BOOT_COMPLETED. Y en el código estableces la configuración del AlarmManager.

El código se ejecutará cuando el móvil termine de reiniciarse y se hayan puesto en marcha todos los servicios del sistema.
Perfecto, gracias a lo que has comentado y esto: http://stackoverflow.com/questions/2...orking-android ya me funcionan las notificaciones aun apagando el móvil.

Una pregunta, es posible matar las "notificaciones" o "servicios" que quedan pendientes? Un ejemplo: el usuario tiene programado que le lleguen notificaciones de la app los Lunes, Martes y Jueves. Lo que pasaría internamente:
Día 1- El lunes está configurado para que salten notificaciones y como el martes también, el intervalo en el que se repetirá se configura para un día.
Día 2- El martes nos suena la notificación y, como el siguiente día es el jueves, se crea otra alarma pero esta vez con intervalo de repetición de dos días.
Día 3- [PROBLEMA] En este día en teoría no debe de sonar ninguna notificación peeeero... la alarma que habíamos creado el lunes, que tiene un intervalo de repetición de 1 día, pues nos suena. Ya estamos haciendolo mal.

Mi pregunta es si hay alguna manera de matar las alarmas que están ahí pendientes, de tal forma que cuando se cree una nueva se eliminen todas las anteriores para así asegurarnos de que no pasa esto ya que solo va a existir una alarma y será la adecuada configurada para el siguiente día que el usuario desea ser notificado.

Otra solución que se me ocurre, que no sé si será muy adecuada pero que creo que funcionaría para lo que yo quiero sería:
Poner la alarma que suene todos los días (osea a intervalo de un día) a la misma hora y en AlarmReciever comprobar si en el día que estamos el usuario desea o no ser notificado. En caso de que si, pues se crea la notificación y en caso contrario no hace nada.

Cómo lo ves?

Un saludo y gracias.
Responder Con Cita
Respuesta

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



Hora actual: 03:31:23 (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 / 邮件联系 /