我正在研究一个简单的AlarmManager示例,并遇到了一个有趣的问题。我正在设置一个布尔值,根据单击的按钮传递我们的意图。有一个“重复警报”和“一次性警报”按钮,告诉我们是否应该重复我们的警报或有一次警报,我正在利用能力传递额外值与意图(intent.putExtra( “关键”,“价值”);),没什么新鲜的,没什么特别的。我遇到的问题是,一旦“密钥”设置一次,就无法重置。
我有一个包含行
的MainActivityAlarmReceiver 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(反之亦然)。从意图中覆盖额外内容是否存在问题?他们是在某处保存并以不同方式访问的吗?只是不确定为什么我一旦设置就无法改变它。
答案 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可能是一个可变对象(通过你所描述的行为)。