Seguinte, eu desenvolvi um app que lista e compara resultados de loterias. Até aqui tudo bem. O problema está na parte do código que trata das notificações. Os resultados das loterias Caixa sempre saem as 20:00, para prevenir problemas causados por atrasos da caixa para atualizar os resultados, eu agendei um AlarmManager para as 21:(Número randômico entre 00 e 20). Como o app precisa de internet para rodar o Service que verifica se há ou não novos sorteios, eu coloquei um if que checa a conexão. Caso haja conexão o servidor é iniciado, caso contrário o app agenda para uma hora adiante. Caso não haja conexão novamente vai agendando para mais uma hora adiante, fazendo isso num total de 5 reagendamentos. Bom, já que a situação está bem explicada agora vem o problema de verdade: o app está mandando notificações em horários totalmente irregulares (rindo para não chorar), eu tentei achar um padrão nos horários mas não encontrei, por isso vim até aqui pedir ajuda. Segue o código com notas:
//Método que define o horário
public long getTime() {
Calendar c = Calendar.getInstance();
Random r = new Random();
int random = r.nextInt(20);
Log.i(TAG, "Número aleatório: "+String.valueOf(random));
c.setTimeInMillis(System.currentTimeMillis());
c.set(Calendar.HOUR_OF_DAY, 21);
c.set(Calendar.MINUTE, random);
Log.i(TAG, "Agendado para: " + c.getTime());
long time = c.getTimeInMillis();
return time;
}
//Método que agenda com repeat
public void agendandoComRepeat() {
long INTERVAL_FIFTEEN_MINUTES = 15 * 60 * 1000;
long INTERVAL_HALF_HOUR = INTERVAL_FIFTEEN_MINUTES * 2;
long INTERVAL_HOUR = 2 * INTERVAL_HALF_HOUR;
long INTERVAL_HALF_DAY = 12 * INTERVAL_HOUR;
long INTERVAL_DAY = 2 * INTERVAL_HALF_DAY;
Intent intent = new Intent("NOVO_SORTEIO");
intent.putExtra("Vez", 0);
AlarmUtil.agendarRepetindo(this, intent, getTime(), INTERVAL_DAY);
Log.i(TAG, "DetalhesSorteio.agendadoComRepeat");
}
//Classe do receiver ativado pela intent "NOVO_SORTEIO". Coloquei ela inteira por segurança.
public class NotificationReceiver extends BroadcastReceiver {
private static String TAG = "Sorteado";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "AÇÃO DO RECEIVER:" + intent.getAction());
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
Bundle args = intent.getExtras();
int vez = args.getInt("Vez");
if (isConnected) {
Log.i(TAG, "Há conexão, iniciando o service normalmente");
context.startService(new Intent(context, NotificationService.class));
}
else {
if (vez < 5) {
Log.i(TAG, "Não há conexão, agendando para depois...");
vez++;
agendandoPraDepois(context, vez);
}
}
}
public void agendandoPraDepois(Context context, int v) {
Intent intent = new Intent("NOVO_SORTEIO");
intent.putExtra("Vez", v);
AlarmUtil.agendar(context, intent, getTime());
Log.i(TAG, "DetalhesSorteio.agendado");
}
public long getTime() {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
c.add(Calendar.HOUR, 1);
Log.i(TAG, "Agendado para: " + c.getTime());
long time = c.getTimeInMillis();
return time;
}
}
A Intent inicial do método que agenda com repeat tem uma int como extra que é utilizada depois para tratar dos loops caso não haja internet. Isso é tudo.