我想在点击button按钮时取消第二个闹钟,可是它照样闹了,请教下高人,问题出在哪?public class MainActivity extends Activity {
private Button btn;
private final static String tag_one = "ALARM_ONE";
private final static String tag_two = "ALARM_TWO";
private final static int requestcode_1 =1;
private final static int requestcode_0 =0;
private Alarm alarm;
private MyBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) this.findViewById(R.id.button1);
btn.setOnClickListener(btnlistener);
alarm = new Alarm(this ,18 ,50 ,tag_one ,requestcode_0);
alarm.setReminder();
alarm = new Alarm(this ,18 ,51 ,tag_two ,requestcode_1);
alarm.setReminder();

}
private OnClickListener btnlistener = new OnClickListener(){ @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
alarm.closealarm(MainActivity.this,requestcode_1);
}};
public class MyBroadcastReceiver extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(tag_one)){
Toast.makeText(context, "第一个闹钟响了!", Toast.LENGTH_LONG).show();
alarm.closealarm(MainActivity.this,requestcode_0);
}
if(intent.getAction().equals(tag_two)){
Toast.makeText(context, "第二个闹钟响了!", Toast.LENGTH_LONG).show();
alarm.closealarm(MainActivity.this,requestcode_1);
}


}

}
@Override
protected void onResume() {
// TODO Auto-generated method stub
receiver=new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();          
filter.addAction(tag_one); //动态注册BroadcastReceiver
filter.addAction(tag_two);
registerReceiver(receiver, filter); 
super.onResume();
}}public class Alarm {
private Context context;
private int hourOfDay;
private int minute;
private String tag;
public int ruquest;
public Alarm(Context context ,int hour ,int minute ,String tag ,int requestcode){
this.context = context;
this.hourOfDay = hour;
this.minute = minute;
this.tag = tag;
this.ruquest = requestcode;
}
public void setReminder(){
AlarmManager mAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent();
intent.setAction(tag);
PendingIntent pending  = PendingIntent.getBroadcast(context, ruquest, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
mAlarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending);
}
public void closealarm(Context context ,int request){
AlarmManager mAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent();
PendingIntent pending = PendingIntent.getBroadcast(context, request, intent, 0);
mAlarm.cancel(pending);
}
}

解决方案 »

  1.   

    public void cancel (PendingIntent operation)Added in API level 1
    Remove any alarms with a matching Intent. Any alarm, of any type, whose Intent matches this one (as defined by filterEquals(Intent)), will be canceled.Parameters
    operation IntentSender which matches a previously added IntentSender.
    See Also
    set(int, long, PendingIntent)
     public void setReminder(){
            AlarmManager mAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent();
            intent.setAction(tag);
            PendingIntent pending  = PendingIntent.getBroadcast(context, ruquest, intent, 0);你设置了、闹钟的时候intent 包含一个tag  当你取消的时候 你是否也要 包含这个tag  我是根据android develop 对API的解释猜测  SDK里面有一句(as defined by filterEquals(Intent)), 
    public boolean filterEquals (Intent other)Added in API level 1
    Determine if two intents are the same for the purposes of intent resolution (filtering). That is, if their action, data, type, class, and categories are the same. This does not compare any extra data included in the intents.你可以尝试一下 在你取消的intent中包含那个tag
      

  2.   

    嗯,的确!把 intent.setAction(tag);加上去就可以了