BroadcastReceiver 中 onReceive 方法中的意图 null 的额外内容

问题描述 投票:0回答:1

我遇到一个问题,我正在尝试设置 Android 通知,但是当我安排带有附加功能的意图时,附加功能会显示为空。

我创建意图和pendingIntent的代码如下所示:

 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"));

我的广播接收器看起来像这样(我也在这里创建了通知通道):

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);
    }
}

我知道额外内容已分配给意图,因为它们显示在我安排警报时设置的日志中。通知在正确的时间触发,但 getStringExtra 方法在广播接收器收到后返回 null。 logcat 数据如下所示:

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

关于我做错了什么有什么想法吗?这是我第一次涉足 Android 开发,所以请原谅任何多余或笨拙的代码。

android android-intent notifications broadcastreceiver android-pendingintent
1个回答
0
投票

当您在意图中使用

intent.putExtra()
时,您应该在从
getString()
获取数据时使用
Intent
。因为
Intent.getStringExtra()
直接从意图对象返回捆绑数据。

更新您的意图获取数据方法

onReceive()

Bundle extras = intent.getExtras();
String title = extras.getString("mainText");
String message = extras.getString("Details");
© www.soinside.com 2019 - 2024. All rights reserved.