1

Dans mon application, il y a une option pour que l'utilisateur répète son événement, et chaque récurrence de cet événement répétitif aura une notification (une alarme) pour rappeler à l'utilisateur que son événement va bientôt commencer .Comment définir une alarme à l'intérieur d'un broadcastreceiver

Alors, quand la première alarme est appelée, elle ouvre la BroadcastReceiver, crée la notification et doit régler l'alarme pour la prochaine récurrence:

@Override 
public void onReceive(Context context, Intent intent) { 
    // When onReceive gets called the event notification is triggered 
    DatabaseHelper myDatabaseHelper = new DatabaseHelper(context); 

     // Create notification 
     int id = intent.getIntExtra("id", 0); 
     String name = intent.getStringExtra("name"); 
     long notificationTime = intent.getLongExtra("notificationTime", 0); 
     String recurrenceType = intent.getStringExtra("recurrenceType"); 
     String message = intent.getStringExtra("message"); 

     if (recurrenceType.equals("Every week")) { 
      // repeatInterval = unix timestamp so * 1000 to get in Millis for notificationTime 
      long repeatInterval = 604800 * 1000; 
      notificationTime += repeatInterval; 
      myDatabaseHelper.updateNotificationTime(notificationTime); 
      setAlarm(context, intent, id, name, notificationTime, recurrenceType, message); 
     } else { 
      myDatabaseHelper.updateNotificationTime(0); 
     } 

     createNotification(context, message, name, id); 
    } 
} 

Maintenant, cela fonctionne très bien pour la première alarme de l'événement. La notification est créée. Maintenant, lorsque la deuxième alarme est appelée, l'intention est vide, donc après la première alarme toutes les autres intentions sont vides et une notification vide est créée, puis l'application se bloque avec NullPointerException. Remarque: je garde mon application ouverte et mon appareil. La méthode setAlarm (...) est dans la classe BroadcastReceiver.

Comment définir mes alarmes:

Stacktrace:

08-25 12:12:35.917 19323-19323/com.madgusto.when2game E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.madgusto.when2game, PID: 19323 
                    java.lang.RuntimeException: Unable to start receiver com.madgusto.when2game.alarm.AlarmReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 
                     at android.app.ActivityThread.handleReceiver(ActivityThread.java:3018) 
                     at android.app.ActivityThread.-wrap18(ActivityThread.java) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1544) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:154) 
                     at android.app.ActivityThread.main(ActivityThread.java:6077) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 
                     at com.madgusto.when2game.alarm.AlarmReceiver.onReceive(AlarmReceiver.java:48) 
                     at android.app.ActivityThread.handleReceiver(ActivityThread.java:3011) 
                     at android.app.ActivityThread.-wrap18(ActivityThread.java)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1544)  
                     at android.os.Handler.dispatchMessage(Handler.java:102)  
                     at android.os.Looper.loop(Looper.java:154)  
                     at android.app.ActivityThread.main(ActivityThread.java:6077)  
                     at java.lang.reflect.Method.invoke(Native Method)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)  

pointeur Alors null à:

if (recurrenceType.equals("Every week")) { 

Maintenant, comment puis-je passer à régler une alarme dans un broadcastreceiver la bonne façon? Merci!

+0

Je travaille encore sur toute aide serait l'apprécier! –

Répondre

0

Il est assez clair ce qui se passe. Regardez ce code:

Intent intentAlarm = new Intent(context, AlarmReceiver.class); 
intent.putExtra("id", id); 
intent.putExtra("name", name); 
intent.putExtra("notificationTime", notificationTime); 
intent.putExtra("recurrenceType", recurrenceType); 
intent.putExtra("message", message); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, id, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT); 

Vous créez un Intent dans la intentAlarm variable mais vous mettez tous les « extras » dans le Intent en utilisant la intent variable. Ensuite, vous passez intentAlarm en tant qu'argument à PendingIntent.getBroadcast(). Bien sûr, intentAlarm ne contient aucun "extras".

Essayez plutôt de mettre tous les "extras" dans intentAlarm.