2016-03-17 10 views
7

Ho ricevuto la notifica alle 22:30. Ma quando il mio dispositivo si spegne alle 22:30 e poi dopo aver acceso il mio dispositivo alle 23:00 non ho ricevuto notifiche in sospeso. Quindi non capisco qual è il problema. ogni aiuto sarà apprezzato.Impossibile impostare l'allarme di ripetizione all'avvio

Ecco il mio codice in attività su create.

Intent alarmIntent = new Intent(CH_Dashboard.this, TimeAlarmEvening.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(CH_Dashboard.this, 0, alarmIntent, 0); 

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Calendar firingCal = Calendar.getInstance(); 
    Calendar currentCal = Calendar.getInstance(); 

    firingCal.set(Calendar.HOUR, 10); 
    firingCal.set(Calendar.MINUTE, 30); 
    firingCal.set(Calendar.SECOND, 0); 
    firingCal.set(Calendar.AM_PM,Calendar.PM); 

    long intendedTime = firingCal.getTimeInMillis(); 
    long currentTime = currentCal.getTimeInMillis(); 

    if(intendedTime >= currentTime) 
    { 
     manager.setRepeating(AlarmManager.RTC, 
       intendedTime, AlarmManager.INTERVAL_DAY, 
       pendingIntent); 
    } 
    else 
    { 
     firingCal.add(Calendar.DAY_OF_MONTH, 1); 
     intendedTime = firingCal.getTimeInMillis(); 

     manager.setRepeating(AlarmManager.RTC, 
       intendedTime, AlarmManager.INTERVAL_DAY, 
       pendingIntent); 
    } 

Il mio codice di ricezione è qui e ricevere una notifica quando il dispositivo è acceso.

 Intent notificationIntent = new Intent(context, CH_Dashboard.class); 
     notificationIntent.putExtra("fromNotification","notify"); 
     TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
     stackBuilder.addParentStack(CH_Dashboard.class); 
     stackBuilder.addNextIntent(notificationIntent); 

     PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 

     builder.setAutoCancel(true); 

     Notification notification = builder.setContentTitle("Demo App Notification") 
       .setContentText("New Notification From Demo App..") 
       .setTicker("New Message Alert!") 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentIntent(pendingIntent).build(); 

     NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(0, notification); 

ecco il mio codice ricevitore Boot.

if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
    { 
    Intent alarmIntent = new Intent(context, TimeAlarmEvening.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); 

    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

    Calendar firingCal = Calendar.getInstance(); 
    Calendar currentCal = Calendar.getInstance(); 

    firingCal.set(Calendar.HOUR, 10); 
    firingCal.set(Calendar.MINUTE, 30); 
    firingCal.set(Calendar.SECOND, 0); 
    firingCal.set(Calendar.AM_PM,Calendar.PM); 

    long intendedTime = firingCal.getTimeInMillis(); 
    long currentTime = currentCal.getTimeInMillis(); 

    if(intendedTime >= currentTime) 
    { 
     manager.setInexactRepeating(AlarmManager.RTC, 
       intendedTime, AlarmManager.INTERVAL_DAY, 
       pendingIntent); 
    } 
    else 
    { 
     firingCal.add(Calendar.DAY_OF_MONTH, 1); 
     intendedTime = firingCal.getTimeInMillis(); 

     manager.setInexactRepeating(AlarmManager.RTC, 
       intendedTime, AlarmManager.INTERVAL_DAY, 
       pendingIntent); 
    } 

    } 

E Ultimo in manifest ho dichiarato ricevente.

 <receiver 
     android:name=".model.AutoStart" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 

    <receiver android:name=".TimeAlarmEvening"> 
     <intent-filter> 
      <action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 

risposta

4

Ho risolto quel giorno ma ho dimenticato di rispondere qui. Ho apportato alcune modifiche nel file manifest. Basta rimuovere la categoria predefinita di default in entrambi i filtri di intent e funziona.

<receiver 
    android:name=".model.AutoStart" 
    android:enabled="true" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

<receiver android:name=".TimeAlarmEvening"> 
    <intent-filter> 
     <action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" /> 
    </intent-filter> 
</receiver> 
0

Non sto scrivendo l'intero codice per voi. Ma posso mostrarti dove puoi applicare la tua logica.

-> Innanzitutto, trova un modo per localizzare te stesso, cosa è mancato, ad esempio monitorando lo stato degli eventi in un database.

-> Quindi, impostare un BOOT_COMPLETEDBroadcastReceiver per trovare quando il telefono viene riavviato. Lì, pianifica eventuali allarmi che si trovano ancora in futuro e decidi cosa fare sugli allarmi che si sono verificati in passato ma che sono mancati (ad esempio, genera una notifica indicando gli eventi mancati).

- Un modo per farlo sarebbe quello di ascoltare per l'evento di arresto telefono:

<action android:name="android.intent.action.ACTION_SHUTDOWN" /> 

e prima che il dispositivo si spegne, risparmiare il tempo di spegnimento.

Poi ascolto per l'avvio del dispositivo:

<action android:name="android.intent.action.BOOT_COMPLETED" /> 

e scrivere la propria logica che determina quali allarmi avrebbero sparato durante i tempi di inattività che, e il fuoco immediatamente quegli allarmi con AlarmManager.

Problemi correlati