Search code examples
androidandroid-intentnotificationsbroadcastreceiverandroid-pendingintent

Extras on intent null in onReceive method in BroadcastReceiver


I have a problem where I'm trying to set up an Android notification, but when I schedule an intent with extras, the extras come over as null.

My code to create the Intent and the PendingIntent looks like this:

EditText alertVacName = findViewById(R.id.editVacName);
EditText alertHotName = findViewById(R.id.editHotName);
EditText alertVacStartDate = findViewById(R.id.editVacStartDate);
EditText alertVacEndDate = findViewById(R.id.editVacEndDate);

String VacName = alertVacName.getText().toString();
String AlertStartDate = alertVacStartDate.getText().toString();
String AlertEndDate = alertVacEndDate.getText().toString();
String AlertHotName = alertHotName.getText().toString();

long trigger = DateConverter.toDate(sVacStartDate).getTime();
Intent intent = new Intent(VacationDetails.this, Vacation_Alert.class);
intent.putExtra("mainText", (VacName + " Starts Today!"));
intent.putExtra("Details", ("Start Date: " + AlertStartDate + "\n" +
        "End Date: " + AlertEndDate + "\n" +
        "Hotel: " + AlertHotName));
Log.d("Checking Intent Content:", intent.getStringExtra("Details"));

PendingIntent sender = PendingIntent.getBroadcast(VacationDetails.this, MainActivity.numAlert, intent, PendingIntent.FLAG_IMMUTABLE);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, trigger, sender);
Log.d("Checking Intent Content After Schedule:", intent.getStringExtra("Details"));

My Broadcast Receiver looks like this (I've also included creating the notification channel here):

public class Vacation_Alert extends BroadcastReceiver {
    String channel_id = "test";
    static int noteID;

    @Override
    public void onReceive(Context context, Intent intent) {
        createNotificationChannel(context, channel_id);

        // Make sure to check if the extras are present before retrieving them
        if (intent != null && intent.getExtras() != null) {
            String title = intent.getStringExtra("mainText");
            String message = intent.getStringExtra("Details");

            // Debugging statement to check the value of "Details"
            Log.d("Vacation_Alert", "Received message: " + message);

            // Ensure that message is not null; use an empty string if it is
            if (message == null) {
                message = "";
            }

            Notification notification = new NotificationCompat.Builder(context, channel_id)
                    .setSmallIcon(R.drawable.vacation)
                    .setContentTitle("Vacation/Excursion Alert!")
                    .setContentText(title)
                    .setContentInfo(message)  // Use the retrieved message
                    .build();

            // Commented out the Toast for now, as it was causing issues
            // Toast.makeText(context, message, Toast.LENGTH_LONG).show();

            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(noteID++, notification);
        } else {
            // Handle the case where the intent or extras are null
            Log.e("Vacation_Alert", "Received null intent or extras");
        }
    }



    private void createNotificationChannel(Context context, String CHANNEL_ID) {
        CharSequence name = "Vacation Alert";
        String description = "Alert for Vacations";

        int importance = NotificationManager.IMPORTANCE_DEFAULT;

        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

I know the extras are assigned to the intent because they show up in the logs that I set up when scheduling the alarm. The notification fires at the correct time, but the getStringExtra methods are returning null after they are received by the broadcast receiver. The logcat data looks like this:

2023-11-30 20:44:05.779 22344-22389 ProfileInstaller        android.reserver.d308project         D  Installing profile for android.reserver.d308project
2023-11-30 20:44:08.478 22344-22365 EGL_emulation           android.reserver.d308project         D  app_time_stats: avg=206.59ms min=1.40ms max=2407.80ms count=13
2023-11-30 20:44:08.634 22344-22365 OpenGLRenderer          android.reserver.d308project         E  Unable to match the desired swap behavior.
2023-11-30 20:44:09.663 22344-22344 Checking I...t Content: android.reserver.d308project         D  Start Date: 2023-11-30
                                                                                                    End Date: 2023-12-05
                                                                                                    Hotel: Text
2023-11-30 20:44:09.664 22344-22344 Compatibil...geReporter android.reserver.d308project         D  Compat change id reported: 160794467; UID 10190; state: ENABLED
2023-11-30 20:44:09.667 22344-22344 Checking I... Schedule: android.reserver.d308project         D  Start Date: 2023-11-30
                                                                                                    End Date: 2023-12-05
                                                                                                    Hotel: Text
2023-11-30 20:44:09.738 22344-22365 EGL_emulation           android.reserver.d308project         D  app_time_stats: avg=52.68ms min=1.84ms max=558.02ms count=18
2023-11-30 20:44:09.807 22344-22365 EGL_emulation           android.reserver.d308project         D  app_time_stats: avg=17.40ms min=1.39ms max=403.42ms count=32
2023-11-30 20:44:09.989 22344-22344 WindowOnBackDispatcher  android.reserver.d308project         W  sendCancelIfRunning: isInProgress=falsecallback=android.view.ViewRootImpl$$ExternalSyntheticLambda17@956e043
2023-11-30 20:44:10.008 22344-22365 OpenGLRenderer          android.reserver.d308project         D  endAllActiveAnimators on 0x7daa5f9caa00 (MenuPopupWindow$MenuDropDownListView) with handle 0x7da94f98c4f0
2023-11-30 20:44:14.671 22344-22344 Vacation_Alert          android.reserver.d308project         D  Received message: null
2023-11-30 20:44:16.380 22344-22365 EGL_emulation           android.reserver.d308project         D  app_time_stats: avg=1643.25ms min=31.65ms max=6418.44ms count=4

Any ideas as to what I'm doing wrong?


Solution

  • You need to change this:

    PendingIntent sender = PendingIntent.getBroadcast(VacationDetails.this,
        ++MainActivity.numAlert, intent, PendingIntent.FLAG_IMMUTABLE);
    

    to this:

    PendingIntent sender = PendingIntent.getBroadcast(VacationDetails.this,
        ++MainActivity.numAlert, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
    

    Adding PendingIntent.FLAG_UPDATE_CURRENT ensures that the new Intent "extras" are copied into the target of the PendingIntent.