Android AlarmManager 只发送最后安排的通知
Android AlarmManager only sending last scheduled notification
我正在创建一个研究应用程序,该应用程序应该每天提示用户 4 次进入他们的心情 - 通过发送通知,单击该通知会启动正确的 Activity
。我可以使用 AlarmManager
安排这些通知,但只显示最后安排的通知。因此,尽管我将它们安排在上午 9 点、下午 2 点、下午 5 点和晚上 8 点,但它只会在晚上 8 点发送通知。
我怎样才能显示所有预定的通知?
这是我设置(其中一个)警报的代码(来自通知管理器class)。请注意,所有警报都是使用 AlarmManager
:
的相同实例设置的
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), createPendingIntent(9, this));
这是 createPendingIntent 方法(在同一个通知管理器中 class):
public static PendingIntent createPendingIntent(int hour, Context c){
Intent notificationIntent = new Intent(c, AlarmBroadcastReceiver.class);
notificationIntent.putExtra("time", hour);
PendingIntent pendingIntent = PendingIntent.getBroadcast(c, 0 , notificationIntent , PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
这里是闹钟的BroadcastReceiver
:
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
NotificationSender.createNotification(context);
}
}
最后 createNotification
方法:
public static void createNotification(Context c){
Log.e("notif?", "creating");
Intent intent = new Intent(c, UpdateMoodActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
int notificationId = new Random().nextInt();
PendingIntent pendingIntent = PendingIntent.getActivity(c, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(c, "com.lizfltn.phdapp.notifChannelID")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("SoftMood")
.setContentText("Please record your mood")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(c);
notificationManager.notify(notificationId, builder.build());
}
是的,我知道这不是最好的做事方式,甚至不是最简洁的方式,但不幸的是,我需要在编写好的代码之前让代码正常工作:P
我已经尝试过各种设置闹钟的配置,例如使用经过的实时时间而不是 RTC,只设置闹钟,设置确切的闹钟等,但可能有一些基本的东西我不理解它们是如何工作的。
感谢任何帮助!
你能在待处理的意图中尝试使用相同的 ID 并通知吗?
createNotification()方法中的通知id为随机id。
int notificationId = new Random().nextInt();
createPendingIntent 方法中使用的 id 为 0。
PendingIntent pendingIntent = PendingIntent.getBroadcast(c, 0 , notificationIntent , PendingIntent.FLAG_UPDATE_CURRENT);
你能尝试对 getBroadcast 的第二个参数使用相同的值吗?
我正在创建一个研究应用程序,该应用程序应该每天提示用户 4 次进入他们的心情 - 通过发送通知,单击该通知会启动正确的 Activity
。我可以使用 AlarmManager
安排这些通知,但只显示最后安排的通知。因此,尽管我将它们安排在上午 9 点、下午 2 点、下午 5 点和晚上 8 点,但它只会在晚上 8 点发送通知。
我怎样才能显示所有预定的通知?
这是我设置(其中一个)警报的代码(来自通知管理器class)。请注意,所有警报都是使用 AlarmManager
:
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, 9);
cal.set(Calendar.MINUTE, 0);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), createPendingIntent(9, this));
这是 createPendingIntent 方法(在同一个通知管理器中 class):
public static PendingIntent createPendingIntent(int hour, Context c){
Intent notificationIntent = new Intent(c, AlarmBroadcastReceiver.class);
notificationIntent.putExtra("time", hour);
PendingIntent pendingIntent = PendingIntent.getBroadcast(c, 0 , notificationIntent , PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
这里是闹钟的BroadcastReceiver
:
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
NotificationSender.createNotification(context);
}
}
最后 createNotification
方法:
public static void createNotification(Context c){
Log.e("notif?", "creating");
Intent intent = new Intent(c, UpdateMoodActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
int notificationId = new Random().nextInt();
PendingIntent pendingIntent = PendingIntent.getActivity(c, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(c, "com.lizfltn.phdapp.notifChannelID")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("SoftMood")
.setContentText("Please record your mood")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(c);
notificationManager.notify(notificationId, builder.build());
}
是的,我知道这不是最好的做事方式,甚至不是最简洁的方式,但不幸的是,我需要在编写好的代码之前让代码正常工作:P
我已经尝试过各种设置闹钟的配置,例如使用经过的实时时间而不是 RTC,只设置闹钟,设置确切的闹钟等,但可能有一些基本的东西我不理解它们是如何工作的。
感谢任何帮助!
你能在待处理的意图中尝试使用相同的 ID 并通知吗? createNotification()方法中的通知id为随机id。
int notificationId = new Random().nextInt();
createPendingIntent 方法中使用的 id 为 0。
PendingIntent pendingIntent = PendingIntent.getBroadcast(c, 0 , notificationIntent , PendingIntent.FLAG_UPDATE_CURRENT);
你能尝试对 getBroadcast 的第二个参数使用相同的值吗?