1

Ich bin zur Zeit ein Problem mit Benachrichtigungen in meiner Anwendung zu debuggen. Für einen bestimmten Kontext möchte ich Benachrichtigungen planen, die immer dann erscheinen sollen, wenn ein Raketenstart stattfindet. Was ich tat, war, nachdem ich eine Liste von geplanten Starts von einer API erhalten hatte, nahm ich das Startdatum (in Millisekunden seit dem 1. Januar 1970) und subtrahiere die System.currentTimeMillis() davon. Ich würde dann die resultierende Zeit verwenden, um die Benachrichtigung in der Zukunft zu planen, dargestellt als System.currentTimeMillis() + timeDifference. Ich habe festgestellt, dass aus irgendeinem Grund nur 1 Benachrichtigung angezeigt wird.Terminplanung für mehrere zukünftige Benachrichtigungen

Ich habe das Debuggen versucht, indem ich Benachrichtigungen nach 2, 4 und 6 Minuten in der Zukunft plane, jedoch wird eine Benachrichtigung erst nach 6 Minuten angezeigt.

Einige relevante Code ist unten:

public void scheduleNotifications(List<Launch> launches) { 

     for(int i = 0; i < launches.size(); i++) { 

      SimpleDateFormat format = new SimpleDateFormat("MMMM dd, yyyy HH:mm:ss z"); 
      Date date = null; 
      try { 
       date = format.parse(launches.get(i).getWindowstart()); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      long timeBetween = date.getTime() - System.currentTimeMillis(); 

      Integer id = Long.valueOf(date.getTime()).intValue(); 

      Intent notificationIntent = new Intent(this, NotificationPublisher.class); 
      notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, id); 
      notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, getNotification(launches.get(i).getRocket().getName(), launches.get(i).getLocation().getPads().get(0).getName())); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, 0); 
      AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
      //Debug. Schedule at 2, 4, 6 minutes. 
      if (i == 0) { 
       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 120000, pendingIntent); 
      } 
      if (i == 1) { 
       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 240000, pendingIntent); 

      } 
      if (i == 2) { 
       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 360000, pendingIntent); 

      } 
     } 
    } 

private Notification getNotification(String rocketName, String padName) { 
     Notification.Builder builder = new Notification.Builder(this); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0); 
     builder.setContentIntent(pendingIntent); 
     builder.setContentTitle("Upcoming Launch"); 
     builder.setContentText("A launch of a " + rocketName + " is about to occur at " + padName + ". Click for more info."); 
     builder.setSmallIcon(R.drawable.rocket_icon); 
     return builder.build(); 
} 

Broadcast-Empfänger:

public class NotificationPublisher extends BroadcastReceiver { 

    public static String NOTIFICATION_ID = "notification_id"; 
    public static String NOTIFICATION = "notification"; 

    public void onReceive(Context context, Intent intent) { 

     NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 

     Notification notification = intent.getParcelableExtra(NOTIFICATION); 
     int id = intent.getIntExtra(NOTIFICATION_ID, 0); 
     notificationManager.notify(id, notification); 

    } 

} 

Ich würde gerne wissen, warum nur eine einzige Meldung jemals präsentiert wird, als auch, was ich brauche hinzufügen um das vorher erklärte Ziel zu erreichen.

Antwort

1

Wenn Sie einen Alarm unter Verwendung von AlarmManager einstellen, wird automatisch jeder vorhandene Alarm mit einer übereinstimmenden PendingIntent gelöscht. Da alle Ihre PendingIntent s dieselben Komponenten enthalten, werden bei jedem Alarm die zuvor eingestellten automatisch gelöscht. Wenn Sie mehrere Alarme einstellen möchten, müssen Sie sicherstellen, dass jeder der PendingIntent s eindeutig ist. Sie können in einer der folgenden Möglichkeiten:

  • Verwenden Sie eine andere requestCode (zweiter Parameter zu PendingIntent.getBroadcast()) für jede PendingIntent
  • Verwenden Sie eine andere Aktion in der Intent Sie passieren zu PendingIntent.getBroadcast() jeder für PendingIntent
+0

Großartig, danke. Ich habe den Parameter 'requestCode' durch eine eindeutige Ganzzahl ersetzt (in diesem Fall nur den Wert von' i') und erhalte jetzt mehrere Benachrichtigungen. – Orbit

Verwandte Themen