尝试将变量传递给BroadcastReceiver类,但只发生一次

时间:2018-07-24 20:33:34

标签: java android-studio

让我在遇到问题之前先解释一下自己在做什么。

最终,我想每周在每周的某些天发送不同的通知。我已经能够通过一个通知来使用它。当我尝试设置多个通知时会发生问题。

因此,在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及更高版本进行通知的经验丰富的人能有所帮助。甚至建议使用不同的方式在不同的日期发送不同的通知。

1 个答案:

答案 0 :(得分:1)

更改以下行

PendingIntent pendingIntent = PendingIntent.getBroadcast(context2, 0, alarmIntent, 0);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context2, notiID, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);