我遇到了一个问题,我试图设置一个Android通知,但当我计划一个额外的意图时,额外的结果是空的.

我创建Intent和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);
    }
}

我知道这些附加内容被分配给了意图,因为它们会出现在我安排闹钟时设置的日志(log)中.通知在正确的时间触发,但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开发,所以请原谅任何多余或笨重的代码.

推荐答案

您需要更改此设置:

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

对此:

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

添加PendingIntent.FLAG_UPDATE_CURRENT确保新的Intent"extra"被复制到PendingIntent的目标中.

Android相关问答推荐

如何在同一行中滚动自定义布局和惰性列,就好像它们是一个组件一样

ComposeView 抢走了 AndroidTV 内容的焦点

Android Studio Relay插件(版本0.3.07)错误

面向Jetpack Compose的可组合放置问题

Jetpack Compose 绘制范围内的动画

[Android][Room] 将密封类存储到 Room 数据库中

判断 AAR 元数据时发现 Android 问题:androidx.core:core:1.12.0-alpha01 和 androidx.core:core-ktx:1.12.0-alpha01

如何在 JetpackCompose 的 LazyColumn 中 Select 多个项目

如何在组件之间导航

如何从日期 Select 器计算年龄?

Jetpack Compose:如何绘制这样的路径/线

如何在包含 Jetpack Compose 内容的布局中使用权重

这是 let 函数的正确用法吗?

Jetpack 组合和片段

Android WebView 没有在第一次页面完成时从本地存储读取数据?

即使我在单选按钮上明确设置了选中状态,RecyclerView 中的单选按钮也会随机取消选中

在 Android Studio 中保存数据

Google API:java.lang.ClassNotFoundException:找不到类sun.misc.Service

单击后退按钮时,应用程序会在一秒钟后崩溃

在android studio中设置pdf文件密码