You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android任务推送通知仅展示最后一条任务数据问题求助

问题根源分析

你的通知只显示最后一条任务数据,核心问题有两个:

  1. 错误依赖Activity全局变量:你在AlarmReceiver里直接引用了TaskActivity的成员变量(比如subjEntry、timeEntryy、randomNum),这些变量会被每次新建任务的操作覆盖。当任何一个闹钟触发时,AlarmReceiver拿到的都是最后一次任务的数值,自然只会显示最后一条数据。
  2. 未传递任务专属数据:你没有把当前任务的标题、时间等信息通过Intent传递给AlarmReceiver,而是寄希望于Activity的全局变量,这是非常不可靠的——Activity随时可能被销毁或重建,变量值会丢失或被覆盖。

解决方案

我们需要修改两个核心部分:把任务数据通过Intent传递给广播接收器,以及在广播接收器中使用传递过来的专属数据创建通知。

第一步:修改TaskActivity,传递任务数据到Intent

在创建PendingIntent时,把当前任务的标题、时间、唯一ID放入Intent的Extra中,同时确保每个任务的PendingIntent有唯一的requestCode(你已经用随机数实现了这一点,这部分是对的):

public void setNotificationForNewTaskInside() {
    alarmManager = (AlarmManager) getApplicationContext().getSystemService(ALARM_SERVICE);
    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    
    // 把当前任务的标题、时间、唯一ID放入Intent Extra
    alarmIntent.putExtra("TASK_TITLE", subjEntry); // 替换成你实际的任务标题变量
    alarmIntent.putExtra("TASK_TIME", timeEntryy); // 替换成你实际的任务时间变量
    Random random = new Random();
    int randomNum = random.nextInt(9999 - 1000) + 1000;
    alarmIntent.putExtra("TASK_ID", randomNum);
    
    // 创建唯一的PendingIntent,FLAG_UPDATE_CURRENT确保Extra能正确更新
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
        getApplicationContext(), 
        randomNum, 
        alarmIntent, 
        PendingIntent.FLAG_UPDATE_CURRENT
    );
    
    long finalLong;
    // 时间判断逻辑
    if (DeviceTimeAndDate.devicetaskTimeDate.equals(newtaskTimeDate)) {
        finalLong = System.currentTimeMillis();
    } else if (DeviceTimeAndDate.devicetaskTimeDate.before(newtaskTimeDate)) {
        finalLong = new_task_timeInMilliseconds;
    } else {
        Toast.makeText(context, "زمان یا تاریخ مورد گذشنه است، لطفا زمان دیگری را انتخاب کنید", Toast.LENGTH_SHORT).show();
        startDate.setText(DeviceTimeAndDate.deviceTime);
        taskTime.setText(EditTaskActivity.secondMiConver);
        return; // 避免设置错误的闹钟,直接返回
    }
    
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, finalLong, pendingIntent);
}

第二步:修改AlarmReceiver,使用传递的数据创建通知

在广播接收器中,从Intent的Extra里取出任务数据,并用任务的唯一ID作为通知ID,确保每个通知都是独立的:

public class AlarmReceiver extends BroadcastReceiver {
    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        // 从Intent中取出任务专属数据
        String taskTitle = intent.getStringExtra("TASK_TITLE");
        String taskTime = intent.getStringExtra("TASK_TIME");
        int taskId = intent.getIntExtra("TASK_ID", 0);
        
        // 设置通知声音
        Uri sound = Uri.parse("android.resource://" + context.getPackageName() + "/raw/plucky");
        
        // 构建通知(如果需要自定义布局,取消下面的注释并替换默认内容)
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "CHANNEL_ID")
                .setContentTitle(taskTitle)
                .setContentText(taskTime)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setSound(sound)
                .setAutoCancel(true); // 点击通知后自动取消

        // 自定义RemoteViews版本(如果需要用你自己的通知布局)
        // RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification);
        // remoteViews.setImageViewResource(R.id.notif_image, R.mipmap.ic_launcher);
        // remoteViews.setTextViewText(R.id.title, taskTitle);
        // remoteViews.setTextViewText(R.id.text, taskTime);
        // builder.setCustomContentView(remoteViews);
        
        // 发送通知,用taskId作为通知ID,确保每个通知唯一
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(taskId, builder.build());
    }
}

额外注意事项
  1. 创建通知渠道:Android 8.0(API 26)及以上必须创建通知渠道,否则通知不会显示。建议在App启动时添加以下代码:
private void createNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = "任务提醒";
        String description = "日常任务的推送通知";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel("CHANNEL_ID", name, importance);
        channel.setDescription(description);
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}
  1. 避免依赖Activity变量:永远不要在BroadcastReceiver或Service中直接引用Activity的成员变量,因为Activity的生命周期不受控,变量值随时可能失效或被覆盖。
  2. PendingIntent的FLAG:你之前用的FLAG_UPDATE_CURRENT是正确的,因为每个PendingIntent的requestCode(随机数)是唯一的,所以每个任务的PendingIntent都是独立的,不会被覆盖。之前的问题和FLAG无关,是数据传递方式错误导致的。

内容的提问来源于stack exchange,提问作者Hadis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:52:36