让我在遇到问题之前先解释一下自己在做什么。
最终,我想每周在每周的某些天发送不同的通知。我已经能够通过一个通知来使用它。当我尝试设置多个通知时会发生问题。
因此,在MainController的OnCreate方法中,我正在调用名为setAlarm的函数并传递变量:
setAlarm(this, 3, 14, 04, 1, 1);
其中'this'是上下文,3是一周中的一天,14是小时,04是分钟,1是秒,最后1是我所说的通知ID。这是setAlarm函数:
public void setAlarm(Context context2, int dayofweek, int hourofday, int dayminute, int daysecond, int notiID){
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
alarmIntent.putExtra("VALUE", notiID);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context2, 0, alarmIntent, 0);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.DAY_OF_WEEK, dayofweek);
calendar.set(Calendar.HOUR_OF_DAY, hourofday);
calendar.set(Calendar.MINUTE, dayminute);
calendar.set(Calendar.SECOND, daysecond);
Date date = calendar.getTime();
//manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 0, pendingIntent);
manager.setExact(AlarmManager.RTC_WAKEUP, date.getTime(),pendingIntent);
}
我在此功能中所做的是将警报管理器设置为在一周的特定日期,特定时间触发。我知道一旦触发,它将调用我设置的AlarmReceiver类。但是我还将通过我设置的alertIntent意图将一个整数变量传递给AlarmReceiver类。
警报管理器工作,并在指定的时间触发。这是我设置的alarmReceiver类:
public class AlarmReceiver extends BroadcastReceiver {
private static AlarmReceiver instance = null;
@Override
public void onReceive(Context context, Intent intent) {
int value = intent.getIntExtra("VALUE", 0);
if (value == 1){
NotificationCompat.Builder noti = new NotificationCompat.Builder(context, "notify_001");
noti.setSmallIcon(R.drawable.clocknoon);
noti.setContentTitle("Bill Sez...");
noti.setContentText("First Notification Test!!!");
noti.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationManager nm = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel = new NotificationChannel("notify_001", "Channel title", NotificationManager.IMPORTANCE_DEFAULT);
nm.createNotificationChannel(channel);
}
nm.notify(0, noti.build());
}
if (value == 2){
NotificationCompat.Builder noti = new NotificationCompat.Builder(context, "notify_002");
noti.setSmallIcon(R.drawable.clocknoon);
noti.setContentTitle("Bill Sez...");
noti.setContentText("This is the second notification test");
noti.setPriority(NotificationCompat.PRIORITY_DEFAULT);
NotificationManager nm = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel = new NotificationChannel("notify_002", "Channel title", NotificationManager.IMPORTANCE_DEFAULT);
nm.createNotificationChannel(channel);
}
nm.notify(0, noti.build());
}
}
}
如您所见,我正在将int变量Value传递给该类,只要我只调用一次setAlarm函数,它就可以正常工作。但是我正在努力使它能够设置多个通知。我希望发生的事情是,我用通知ID(notiID)调用setAlarm函数,并在指定的时间触发警报管理器,并将多余的变量值与执行流程一起传递给alarmReceiver类。在Alarm Receiver类中,我设置了一个if语句来测试变量“ value”以查看它是1还是2,并基于该变量触发一条通知并出现在电话上。
发生的事情是,当我两次调用setAlarm函数时,从未收到第一个通知。更奇怪的是,收到了第二个通知,但是它的变量“值”是1,而不是我期望的2。
例如: 因此,我调用setAlarm并将警报设置为在星期二的12:05:01发出,并传递notiID1。然后我再次调用setAlarm并将警报设置为在星期二的12:06:01发出警报,并通过notiID之2。
在12:05:01,什么都没有发生。我应该看到第一个通知,但没有。在12:06:01,我收到一条通知,但看到的是第一个通知,而不是第二个通知。同样,如果我在AlarmReceiver类中放置一个断点并查看将“值”设置为什么,则该断点将显示为1,而不是2。
所以我不知道发生了什么事。我希望对使用Android 8.0.0及更高版本进行通知的经验丰富的人能有所帮助。甚至建议使用不同的方式在不同的日期发送不同的通知。
答案 0 :(得分:1)
更改以下行
PendingIntent pendingIntent = PendingIntent.getBroadcast(context2, 0, alarmIntent, 0);
到
PendingIntent pendingIntent = PendingIntent.getBroadcast(context2, notiID, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);