如何根据 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
与解析后的 LocalTime
到 java.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);
});
}
我有一个 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
与解析后的 LocalTime
到 java.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);
});
}