如何根据 LocalTime 列表创建通知?

How to create notification based on a list of LocalTime?

我有一个 LocalTime 列表,我需要循环抛出它们,return 分别将小时和分钟添加到通知中

当我单独对待它们时,可以使用 getHour() 或 getMinute() 方法,但在列表中它不起作用

String q = "01:00:00";
String w = "02:00:00";
String e = "03:00:00";
String r = "04:00:00";

LocalTime qq = LocalTime.parse(q);
LocalTime ww = LocalTime.parse(w);
LocalTime ee = LocalTime.parse(e);
LocalTime rr = LocalTime.parse(r);

List<LocalTime> listTimes = new ArrayList<>();
        listTimes.add(qq);
        listTimes.add(ww);
        listTimes.add(ee);
        listTimes.add(rr);


for(int i=0 ; i<=listTimes.size() ; i++) {
                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY,listTimes.get(i).getHour());
                calendar.set(Calendar.MINUTE, listTimes.get(i).getMinute());
                calendar.set(Calendar.SECOND, listTimes.get(i).getSecond());


         Intent intent = new Intent(getApplicationContext(), Notification_reciever.class);

                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT);

                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);      
     }

以及通知的实际创建:

public void onReceive(Context context, Intent intent) {

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


    int notificationId = 1;
    String channelId = "channel-01";
    String channelName = "Channel Name";
    int importance = NotificationManager.IMPORTANCE_HIGH;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        NotificationChannel mChannel = new NotificationChannel(
                channelId, channelName, importance);
        notificationManager.createNotificationChannel(mChannel);
    }


    Intent repeating_intent = new Intent(context,ReaptingActivity.class);

    repeating_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(context,100,repeating_intent,PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId).setContentIntent(pendingIntent).setSmallIcon(R.drawable.ic_free_breakfast_black_24dp)
            .setContentTitle("Notificatio Title").setContentText("Notification message").setAutoCancel(true);

    notificationManager.notify(notificationId,builder.build());


}

当我在没有 for 循环的情况下单独设置通知时,它可以正常工作,但是当我为列表添加循环时,它不起作用

我会停止使用 java.util.Calendar 并完全切换到 java.time

如果你有一个时间列表并且你想将它们与当天结合起来(我猜你使用 java.util.Calendar.getInstance()),你可以将今天的 java.time.LocalDate 与解析后的 LocalTimejava.time.LocalDateTime 并使用其以毫秒为单位获取时间的可能性:

public static void main(String[] args) {
    String q = "01:00:00";
    String w = "02:00:00";
    String e = "03:00:00";
    String r = "04:00:00";

    LocalTime qq = LocalTime.parse(q);
    LocalTime ww = LocalTime.parse(w);
    LocalTime ee = LocalTime.parse(e);
    LocalTime rr = LocalTime.parse(r);

    List<LocalTime> listTimes = new ArrayList<>();
    listTimes.add(qq);
    listTimes.add(ww);
    listTimes.add(ee);
    listTimes.add(rr);

    // find out what day today is and do that outside the loop
    LocalDate today = LocalDate.now();

    // iterate/stream all the parsed times
    listTimes.forEach(time -> {
        // combine the time with today
        LocalDateTime dateTime = LocalDateTime.of(today, time);
        // then convert it to an Instant (choose the offset you need) and get the millis
        long timeInMillis = dateTime.atZone(ZoneId.systemDefault())
                                .toInstant()
                                .toEpochMilli();

        Intent intent = new Intent(getApplicationContext(), Notification_reciever.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
                                                                100,
                                                                intent,
                                                                PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                                    // use the millis here then
                                    timeInMillis,
                                    AlarmManager.INTERVAL_DAY,
                                    pendingIntent);
    });
}