简体   繁体   中英

Scheduling multiple future notifications

I am currently debugging an issue with notifications inside my application. For some context, what I'd like to do is schedule notifications that should popup whenever a rocket launch is occurring. What I was doing was, after getting a list of scheduled launches from an API, I would take the launch date (in milliseconds since Jan 1 1970) and subtract the System.currentTimeMillis() from it. I would then use the resulting time to schedule the notification in the future, represented as System.currentTimeMillis() + timeDifference . I noticed that for whatever reason, only 1 notification is ever displayed.

I've tried debugging by scheduling notifications at 2, 4, and 6 minutes in the future, however a notification is only displayed at the 6 minute mark.

Some relevant code is below:

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 Receiver:

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);

    }

}

I'd like to know why only a single notification is ever presented, as well as what I need to add to achieve the previously stated goal.

When you set an alarm using AlarmManager , it automatically cancels any existing alarm that has a matching PendingIntent . Since all your PendingIntent s contain the same components, every time you set an alarm, the previously set ones are automatically cancelled.

If you want to set multiple alarms, you must make sure that each of the PendingIntent s is unique. You can do this in one of the following ways:

  • Use a different requestCode (second parameter to PendingIntent.getBroadcast() ) for each PendingIntent
  • Use a different ACTION in the Intent you pass to PendingIntent.getBroadcast() for each PendingIntent

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM