Olá, tenho um app que mostra notificaçoes ao usuario duas vezes ao dia, uma na parte da manha e outra na parte da tarde se as notificaçoes estiverem habilitadas nas configuraçoes. Os horarios em que as notificaçoes sao disparadas tambem sao opcionais Para isso eu uso o AlarmManager para disparar as notifixcaçoes na hora definida pelo usuario, como se fosse um despertador. Desde de que eu tornei os horarios opcionais, eu comecei a notar um comportamento estranho, atualmente eu tenho os seguintes problrmas:
-
Mesmo usando AlarmManager.RTC_WAKEUP no AlarmManager ele só notifica quando eu acendo a tela do celular.
EX.: defini uma notificaçao para as 08:00, apos as 8 da manha se eu desbloquear a tela a notificaçao chega instantaneamente, se nao ele nunca vem.
Antes ele notificava na hora certa idenpendete do celular estar em uso ou nao. -
Apos setar um novo horario eu chamo o metodo turnOff e dps o TurnOn (código abaixo) pra abortar as notificaçoes
atuais e recria-las no novo horario, porem n passam nem 2 minutos e ele notifica, isso na vdd acontece desde que eu implemenei a funcionalidade de notificaçoes com AlarmManager.
Aqui esta a classe responsavel por gerenciar as notificaçoes
/**
* Criado por Gilian Marques em 11/12/2016.
*/
public class MyNotificationManager {
private Context mContext;
public MyNotificationManager(Context mContext) {
this.mContext = mContext;
}
public void turnOnNotifications() {
Calendar calendar = Calendar.getInstance();
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(mContext.ALARM_SERVICE);
Configuraçao conf = Configuraçao.getInstancia(mContext);
// crio a notificação da manha
String[] spliterAm = conf.getValue(Key.NOT_HORARY_AM, Value.NOT_HORARY_DEFAULT_AM).split(":"); //obtem o horario das sharedPreferences
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(spliterAm[0])); // seta o horario em uma Instancia de Calendar
calendar.set(Calendar.MINUTE, Integer.parseInt(spliterAm[1]));
calendar.set(Calendar.SECOND, 00);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(mContext, 0, new Intent("CHECAR_DEBITOS_MANHA"), 0));
// crio a notificação da tarde da mesma forma que a da manha
// a diferença é que eu n crio outra instancia de calendar, uso a mesma porem setando um novo valor
String[] spliterPm = conf.getValue(Key.NOT_HORARY_AM,Value.NOT_HORARY_DEFAULT_PM).split(":");
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(spliterPm[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(spliterPm[1]));
calendar.set(Calendar.SECOND, 00);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(mContext, 0, new Intent("CHECAR_DEBITOS_TARDE"), 0));
checkChanges();
}
/**
* Desliga as notificaçoes
*/
public void turnOffNotifications() {
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(mContext.ALARM_SERVICE);
alarmManager.cancel(PendingIntent.getBroadcast(mContext, 0, new Intent("CHECAR_DEBITOS_TARDE"), 0));
alarmManager.cancel(PendingIntent.getBroadcast(mContext, 0, new Intent("CHECAR_DEBITOS_MANHA"), 0));
checkChanges();
}
/**
* Checa o estado das notificaçoes
* @return true se a notificaçoes estiverem ligadas
*/
public boolean checkChanges() {
String nm = "MyNotificationManager ";
boolean alarmeAtivoManha = (PendingIntent.getBroadcast(mContext, 0, new Intent("CHECAR_DEBITOS_MANHA"), PendingIntent.FLAG_NO_CREATE) == null);
boolean alarmeAtivoTarde = (PendingIntent.getBroadcast(mContext, 0, new Intent("CHECAR_DEBITOS_TARDE"), PendingIntent.FLAG_NO_CREATE) == null);
// Toast.makeText(mContext, alarmeAtivoManha ? nm + "Alarme manha foi desativado" : nm + "Alarme manha foi ativado", Toast.LENGTH_SHORT).show();
// Toast.makeText(mContext, alarmeAtivoTarde ? nm + "Alarme tarde foi desativado" : nm + "Alarme tarde foi ativado", Toast.LENGTH_SHORT).show();
if (alarmeAtivoManha && alarmeAtivoTarde) {
return true;
} else {
return false;
}
}
}
Por favor me deem uma luz, por que mesmo usando RTC_WAKEUP o AlarmManager n dispara com o aparelho desligado ? e porque dispara apos setar as notificaçoes? tambem acito sugestoes caso conheçam uma forma melhor de realizar essa tarefa. Vale lembrar que a ideia é disparar as notificaçoes como se fosse um app de despertador, Sempre e apenas na hora exata. Obrigado a todos.