【问题标题】:Getting extras from an intent through a bundle won't allow updated values通过捆绑从意图中获取额外内容将不允许更新值
【发布时间】:2014-03-14 15:44:13
【问题描述】:

我正在研究一个简单的 AlarmManager 示例,但遇到了一个有趣的问题。我正在根据单击的按钮设置一个布尔值以通过我们的意图传递。有一个“重复警报”和“一次警报”按钮告诉我们是否应该重复我们的警报或有一次警报,我正在利用意图传递额外值的能力(intent.putExtra( "key","value");),没什么新鲜的,没什么特别的。我遇到的问题是,一旦设置了“密钥”,就无法重置。

我有一个包含该行的 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 alarm”按钮,即使我点击“repeat alarm”按钮并尝试设置“one_time”,“one_time”布尔值也会设置为true并保持设置为true " 布尔为假(反之亦然)。从意图中覆盖附加内容是否存在问题?他们是否保存在某个地方并以不同的方式访问或其他什么?只是不知道为什么我不能在设置后更改该值。

【问题讨论】:

    标签: android android-intent bundle


    【解决方案1】:

    尝试改变这个:

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

    到这里:

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

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

    【讨论】:

      【解决方案2】:

      尝试使用 -
      getIntent().removeExtra("one_time");
      并使用您的初始代码重新设置它 -
      repeatIntent.putExtra("one_time", false);


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

      【讨论】:

      • 应该提到我试过这个,我也有同样的想法,但也没有用
      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2020-12-21
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多