当前位置: 代码迷 >> Android >> 通过捆绑包从意图中获取额外内容将不允许更新值
  详细解决方案

通过捆绑包从意图中获取额外内容将不允许更新值

热度:116   发布时间:2023-08-04 12:50:59.0

我正在研究一个简单的AlarmManager示例,并且遇到了一个有趣的问题。 我正在基于单击的按钮设置要通过我们的意图传递的布尔值。 有一个“重复警报”和“一次警报”按钮,告诉我们是应该重复警报还是一次警报,我正在利用通过意图传递额外值的功能(intent.putExtra( “键”,“值”);),没有新内容,也没有什么特别之处。 我遇到的问题是,一旦“密钥”设置一次,就无法重置。

我有一个MainActivity,其中包括

AlarmReceiver alarm = new AlarmReceiver();

在该活动中,有2个按钮。 如果我单击“重复警报”按钮,我会打电话

alarm.SetAlarm(context);

这是我的AlarmReceiver类中的方法:

// Set our repeating alarm
public void SetAlarm(Context context){
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent repeatIntent = new Intent(context, AlarmReceiver.class);
    repeatIntent.putExtra("one_time", false);               // this should change our boolean
    PendingIntent pi = PendingIntent.getBroadcast(context, 0 , repeatIntent, 0);
    // Set to go off after 5 seconds
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5, pi);
}

如果我单击“一次警报”按钮,我会打电话

alarm.SetOneTimeAlarm(context);

这是我的AlarmReceiver类中的方法:

// Set our one time alarm
public void SetOneTimeAlarm(Context context){
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent oneTimeIntent = new Intent(context, AlarmReceiver.class);
    oneTimeIntent.putExtra("one_time", true);               // this should change our boolean
    PendingIntent pi = PendingIntent.getBroadcast(context,  0, oneTimeIntent, 0);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
}

但是,在我的AlarmReceiver类的onReceive()方法中:

Bundle extras = intent.getExtras();
String messageString = "";
boolean oneTime = extras.getBoolean("one_time", false);

if(extras != null && oneTime == true){
    messageString = messageString + "One time Timer : ";
}
else{
    messageString = messageString + "Repeating Timer : ";
}

Format formatter = new SimpleDateFormat("hh:mm:ss a");
messageString = messageString + formatter.format(new Date());

Toast.makeText(context, messageString, Toast.LENGTH_LONG).show();

问题是,如果我单击“一次警报”按钮,则即使单击“重复警报”按钮并尝试将“ one_time”布尔值设置为true,“ one_time”布尔值也会设置为true并保持设置为true。错误(反之亦然)。 意图覆盖额外内容是否存在问题? 它们是否保存在某个地方并以其他方式访问? 只是不确定为什么设置后我不能更改该值。

尝试更改此:

PendingIntent pi = PendingIntent.getBroadcast(context, 0 , repeatIntent, 0);

对此:

PendingIntent pi = PendingIntent.getBroadcast(context, 0 , repeatIntent, PendingIntent.FLAG_UPDATE_CURRENT);

问题可能是在触发新警报时您的意图没有被刷新。

尝试使用-
getIntent()。removeExtra(“ one_time”);
然后使用您的初始代码进行重新设置-
repeatIntent.putExtra(“ one_time”,false);


我不确定,因为我从没看过它,但是Bundle可能是一个可变对象(根据您描述的行为)。

  相关解决方案