Notificación de incendio cada 24 horas ya la hora exacta de 8 AM

Estoy usando AlarmManager() para AlarmManager() notificación y repetirla cada 24 horas.

Mi código está en onCreate() en Splash Actividad que se onCreate() primero cuando alguien abre App. El usuario puede instalar la aplicación en cualquier momento. Así que quiero que cuando el usuario instala la aplicación, comprueba la sincronización y luego dispara la notificación a las 8 de la mañana y lo repite diariamente. No quiero recibir notificaciones cuando alguien abra la aplicación.

Mi código es el siguiente:

 public class Splash extends Activity { final String WebsiteURL = "http://www.mytestbuddy.com"; String cookie; @SuppressLint("SimpleDateFormat") @Override protected void onCreate(Bundle showSplash) { // TODO Auto-generated method stub super.onCreate(showSplash); setContentView(R.layout.splash); getWindow().getDecorView().setBackgroundColor(Color.WHITE); Intent myIntent = new Intent(Splash.this, AlarmReceiver.class); final PendingIntent pendingIntent = PendingIntent.getBroadcast( Splash.this, 0, myIntent, 0); final AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); CookieSyncManager.createInstance(this); CookieManager cm = CookieManager.getInstance(); cm.setAcceptCookie(true); CookieSyncManager.getInstance().sync(); if (cm.getCookie("" + WebsiteURL + "") != null) { cookie = cm.getCookie("" + WebsiteURL + "").toString(); } else { cookie = null; } Thread timer = new Thread() { public void run() { try { sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } finally { if (cookie == null) { Intent openStartingPoint = new Intent( "com.MobileWeb.mytestbuddy.Login"); startActivity(openStartingPoint); } else if (cookie.contains("Premium")) { Calendar firingCal = Calendar.getInstance(); Calendar currentCal = Calendar.getInstance(); firingCal.set(Calendar.HOUR, 10); firingCal.set(Calendar.MINUTE, 30); firingCal.set(Calendar.SECOND, 0); long intendedTime = firingCal.getTimeInMillis(); long currentTime = currentCal.getTimeInMillis(); if (intendedTime >= currentTime) { alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } else { firingCal.add(Calendar.DAY_OF_MONTH, 1); intendedTime = firingCal.getTimeInMillis(); alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } Intent openStartingPoint = new Intent( "com.MobileWeb.mytestbuddy.PremiumMain"); startActivity(openStartingPoint); } else { Calendar firingCal = Calendar.getInstance(); Calendar currentCal = Calendar.getInstance(); firingCal.set(Calendar.HOUR, 10); firingCal.set(Calendar.MINUTE, 30); firingCal.set(Calendar.SECOND, 0); long intendedTime = firingCal.getTimeInMillis(); long currentTime = currentCal.getTimeInMillis(); if (intendedTime >= currentTime) { alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } else { firingCal.add(Calendar.DAY_OF_MONTH, 1); intendedTime = firingCal.getTimeInMillis(); alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } Intent openStartingPoint = new Intent( "com.MobileWeb.mytestbuddy.Main"); startActivity(openStartingPoint); } } } }; timer.start(); } 

}

Hacer lo que sugirió chintan. Para obtener una imagen clara, la exact solution podría parecer algo similar a la siguiente:

 Intent myIntent = new Intent(Splash.this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(Splash.this, 0, myIntent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar firingCal= Calendar.getInstance(); Calendar currentCal = Calendar.getInstance(); firingCal.set(Calendar.HOUR, 8); // At the hour you wanna fire firingCal.set(Calendar.MINUTE, 0); // Particular minute firingCal.set(Calendar.SECOND, 0); // particular second long intendedTime = firingCal.getTimeInMillis(); long currentTime = currentCal.getTimeInMillis(); if(intendedTime >= currentTime){ // you can add buffer time too here to ignore some small differences in milliseconds // set from today alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } else{ // set from next day // you might consider using calendar.add() for adding one day to the current day firingCal.add(Calendar.DAY_OF_MONTH, 1); intendedTime = firingCal.getTimeInMillis(); alarmManager.setRepeating(AlarmManager.RTC, intendedTime, AlarmManager.INTERVAL_DAY, pendingIntent); } 

Aquí está el pseudocódigo:

Tienes que escribir este código dentro de tu Splash.java

Paso 1: Is_Alarm_Set(); [Boolean]

Paso 2: false [paso 3]

Paso 2: true [paso 8] (No es necesario configurarlo)

Paso 3: Get_Time() [Tiempo actual del usuario móvil]

Paso 4: Find_Time_Difference() [Esta función encontrará la diferencia entre la hora del móvil del usuario y su Hora de arreglo (8AM).]

Paso 5: Ahora configure su alarma según la diferencia horaria. [Es decir, la hora actual es 7 pm y la fecha es 1-junio y luego la alarma programada de 8 AM para el día siguiente.]

Paso 6: Establezca sus días de repetición setRepeating ()

Paso 7: Se disparará la alarma como por su tiempo fijo 8 AM.

Paso 8: Cambie su actividad.

Appu respuesta me ayudó mucho, pero si desea una versión fija de un poco más legible y en cortocircuito mira esto:

 PendingIntent pendingIntent = PendingIntent.getBroadcast(Splash.this, 0, myIntent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar firingCal= Calendar.getInstance(); Calendar currentCal = Calendar.getInstance(); firingCal.set(Calendar.HOUR_OF_DAY, 8); // At the hour you wanna fire firingCal.set(Calendar.MINUTE, 0); // Particular minute firingCal.set(Calendar.SECOND, 0); // particular second if(firingCal.compareTo(currentCal) < 0) { firingCal.add(Calendar.DAY_OF_MONTH, 1); } Long intendedTime = firingCal.getTimeInMillis(); alarmManager.setRepeating(AlarmManager.RTC, intendedTime , AlarmManager.INTERVAL_DAY, pendingIntent); 
 // Retrieve a PendingIntent that will perform a broadcast Intent alarmIntent = new Intent(HomeContactActivity.this, AlarmReceiver.class); pendingIntent = PendingIntent.getBroadcast( HomeContactActivity.this, 0, alarmIntent, 0); AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // Set the alarm to start at 10:00 AM Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 10); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 86400000, // for repeating // in every 24 // hours pendingIntent); 
  • Android: Obtén todos los PendingIntents establecidos con AlarmManager
  • ¿Cómo configurar una alarma de repetición exacta en API 19 (kitkat)?
  • Cómo permitir que el teléfono funcione mientras usa la alarma RTC en Android
  • Desarrollador de Android - Alarm manager vs service
  • Administrador de alarmas en android
  • Cómo configurar múltiples alarmas usando el administrador de alarmas de android
  • Crear y cancelar varias alarmas configuradas con AlarmManager
  • ¿Cómo puedo configurar un administrador de alarmas para disparar cada día específico de la semana y el tiempo en android?
  • ¿Cuán inexacto es setInexactRepeating () para AlarmManager?
  • Utilice alarmManager y el servicio para realizar la notificación de planificación sólo durante un período de tiempo específico
  • AlarmManager setExact con WakefulBroadcastReceiver a veces no es exacto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.