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 的第二个参数使用相同的值吗?