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

时间:2014-03-14 15:44:13

标签: android android-intent bundle

我正在研究一个简单的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并保持设置为true,即使我单击“重复闹钟”按钮并尝试设置“one_time” “boolean to false(反之亦然)。从意图中覆盖额外内容是否存在问题?他们是在某处保存并以不同方式访问的吗?只是不确定为什么我一旦设置就无法改变它。

2 个答案:

答案 0 :(得分:3)

尝试改变这一点:

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

到此:

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

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

答案 1 :(得分:0)

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


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