1

I am trying to send a notification at a specific time after registering an item on a database (6 hours or 12 hours). The notification works fine when I only register one item, however if I register 2 items in a close period of time the first notification is overwritten by the second.

I know that I have to add ID's to the pending intents and maybe an id to the actual notification however I am not very familiar with the alarmManager class and I do not know where I should be adding the IDs. How do I make these two notifications independent of one another?

NotificationHelper Class:


public static class NotificationHelper extends ContextWrapper {

        public static final String channel1ID = "channel1ID";
        public static final String channel1Name = "USER1";

        private NotificationManager mManager;


        public NotificationHelper(Context base) {
            super(base);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                createChannels();
            }
        }

        @RequiresApi(api = Build.VERSION_CODES.O)
        private void createChannels() {

            NotificationChannel channel1 = new NotificationChannel(channel1ID, channel1Name, NotificationManager.IMPORTANCE_HIGH);
            channel1.enableLights(true);
            channel1.enableVibration(true);
            channel1.shouldVibrate();
            channel1.setShowBadge(true);
            channel1.setLightColor(R.color.colorPrimary);
            channel1.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
            Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
                    .setUsage(USAGE_NOTIFICATION)
                    .build();
            channel1.setSound(uri, audioAttributes);

            getManager().createNotificationChannel(channel1);


        }

        public NotificationManager getManager() {
            if (mManager == null) {
                mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            }
            return mManager;
        }


        public NotificationCompat.Builder getChannel1Notification() {
            return new NotificationCompat.Builder(getApplicationContext(), channel1ID)
                    .setContentTitle("Dressing")
                    .setContentText("Please scan the dressing on your: " + (et_DressingPos.getText().toString().trim()))
                    .setSmallIcon(R.drawable.ic_cnoticiation_scan);


        }


    }


AlarmReceiver Class:


 @Override
    public void onReceive(Context context, Intent intent) {
        Camera2Register.NotificationHelper notificationHelper = new Camera2Register.NotificationHelper(context);
        NotificationCompat.Builder nb = notificationHelper.getChannel1Notification();
        Intent intent2 = new Intent(context, Camera2.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent2, 0);
        nb.setContentIntent(pendingIntent);
        notificationHelper.getManager().notify(1, nb.build());
    }
}

startAlarmScan and startALarmChange Methods:


private void startAlarmScan() {
        int requestCode = ("someString" + System.currentTimeMillis()).hashCode();

        Long time = System.currentTimeMillis();

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlarmReceiver.class);
        intent.putExtra("randomRequestCode", requestCode);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent, 0);

        long milliseconds = 5000;
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, (time + milliseconds), pendingIntent);

        //}
    }

    private void startAlarmChange() {
        int requestCode = ("someString" + System.currentTimeMillis()).hashCode();

        Long time = System.currentTimeMillis();
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlarmReceiver.class);
        intent.putExtra("randomRequestCode", requestCode);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent, 0);

        long milliseconds = 30000;

            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, (time + milliseconds), pendingIntent2);
        //}
    }


I have set the time delay for the two different notifications to 5 and 30 seconds. If register and class the two startAlarmScan and startAlarmChange methods within 30 seconds of each other. the first scheduled notification will be overwritten by the second.

I am beginning to think the problem may lie in the structuring of my notification system, is a Receiver class necessary? There is no mention of it in the notification documentation on Android.

1 Answers1

1

You are using a constant value "1" for your notification id here: notificationHelper.getManager().notify(1, nb.build());

from the docs: Here "If a notification with the same id has already been posted by your application and has not yet been canceled, it will be replaced by the updated information"

Change this 1 to a unique number for each notification and you should see them all come through.

Edit You also do the same thing on the line:

PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent2, 0);

That request code "1" is used to compare pending intents using filterEquals(Intent intent) This question talks about it.

Crompy
  • 176
  • 1
  • 9
  • Thanks for the reply, I have implemented this however I am still getting my notifications overwritten each time I create a new notification? – Jonathan James Jul 21 '19 at 13:23
  • Edited my response. You also have a constant for your pending intent request code. – Crompy Jul 21 '19 at 13:39
  • So every request code needs to be unique? Or do they need to match between the AlarmReceiver class and the method? – Jonathan James Jul 21 '19 at 13:49
  • There are two things going on here 1) the Pending Intent which must have unique request code and 2) The notification which must have unique notification id. It doesn't matter if the notification id matches the pending intents' request code. – Crompy Jul 22 '19 at 00:04