问题描述
我正在研究一个简单的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。错误(反之亦然)。 意图覆盖额外内容是否存在问题? 它们是否保存在某个地方并以其他方式访问? 只是不确定为什么设置后我不能更改该值。
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可能是一个可变对象(根据您描述的行为)。