通过alarmmanager.cancel方法进行清除闹钟操作,代码如下:
public class Alarm extends LinearLayout {private Button button;private ListView listView;ArrayAdapter<Alarm.myalarm> adapter;private SharedPreferences sp;private static final String ALARM="myalarm";private AlarmManager alarmManager;public Alarm(Context context) {super(context);init();}public Alarm(Context context, AttributeSet attrs) {super(context, attrs);init();}public Alarm(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}public void init(){alarmManager=(AlarmManager)getContext().getSystemService(Context.ALARM_SERVICE);}@Override protected void onFinishInflate() {super.onFinishInflate();button = (Button) findViewById(R.id.btn1);listView = (ListView) findViewById(R.id.list1);adapter = new ArrayAdapter<Alarm.myalarm>(getContext(), android.R.layout.simple_list_item_1);listView.setAdapter(adapter);sp = getContext().getSharedPreferences("alarm", Context.MODE_PRIVATE);readAlarm();button.setOnClickListener(new OnClickListener() {@Override public void onClick(View view) {addAlarm();}});listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int i, long l) {new AlertDialog.Builder(getContext()).setTitle("operation").setItems(new CharSequence[]{ "delete"}, new DialogInterface.OnClickListener() {@Override public void onClick(DialogInterface dialogInterface, int i) {switch (i) {case 0:deleteAlarm(i);break;}}}).setNegativeButton("cancel", null).show();return false;}});}public void deleteAlarm(int position){myalarm aa=adapter.getItem(position);adapter.remove(aa);saveAlarm();alarmManager.cancel(PendingIntent.getBroadcast(getContext(),aa.getId(),new Intent(getContext(),AlarmReceiver.class),0));}public void addAlarm(){final Calendar calendar=Calendar.getInstance();new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {@Override public void onTimeSet(TimePicker timePicker, int hour, int minute) {Calendar c=Calendar.getInstance();c.set(Calendar.HOUR,hour);c.set(Calendar.MINUTE,minute);c.set(Calendar.SECOND,0);c.set(Calendar.MILLISECOND,0);Calendar currenttime=Calendar.getInstance();if (c.getTimeInMillis()<currenttime.getTimeInMillis()){c.setTimeInMillis(c.getTimeInMillis()+24*60*60*1000);}myalarm ad=new myalarm(c.getTimeInMillis());adapter.add(ad);alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,ad.getTime(),1*60*1000, PendingIntent.getBroadcast(getContext(),ad.getId(),new Intent(getContext(),AlarmReceiver.class),0));saveAlarm();}},calendar.get(Calendar.HOUR),calendar.get(Calendar.MINUTE),true).show();}public void saveAlarm(){SharedPreferences.Editor editor=sp.edit();StringBuffer sb=new StringBuffer();for (int i=0;i<adapter.getCount();i++){sb.append(adapter.getItem(i).getTime()).append(",");}if (sb.length()>1){editor.putString(ALARM,sb.toString().substring(0,sb.length()-1));}else {editor.putString(ALARM,null);}editor.commit();}private void readAlarm(){String content=sp.getString(ALARM,null);if (content!=null){String[] timeString=content.split(",");for (String string:timeString){adapter.add(new myalarm(Long.parseLong(string)));}}}class myalarm{private Calendar date;private long time=0;private String timeLabel="";public myalarm(long time){this.time=time;date=Calendar.getInstance();date.setTimeInMillis(time);timeLabel=String.format("%dM%dD%d:%d",date.get(Calendar.MONTH)+1,date.get(Calendar.DAY_OF_MONTH),date.get(Calendar.HOUR),date.get(Calendar.MINUTE));}public long getTime() {return time;}public String getTimeLabe() {return timeLabel;}@Override public String toString() {return timeLabel;}public int getId(){return (int)getTime()/1000/60;}}}其中在myalarm类里面添加了一个getid方法,是为了呼应
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,ad.getTime(),1*60*1000, PendingIntent.getBroadcast(getContext(),ad.getId(),new Intent(getContext(),AlarmReceiver.class),0));
以及deletealarm方法中的:
alarmManager.cancel(PendingIntent.getBroadcast(getContext(),aa.getId(),new Intent(getContext(),AlarmReceiver.class),0));
在alarmreceiver中代码如下:
public class AlarmReceiver extends BroadcastReceiver {@Override public void onReceive(Context context, Intent intent) {System.out.println("alarm operate");AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);am.cancel(PendingIntent.getBroadcast(context,getResultCode(),new Intent(context,AlarmReceiver.class),0));} }这里也需要执行cancel操作