import java.util.Calendar;
import android.annotation.SuppressLint;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.format.Time;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TimePicker;
public class AlarmView extends LinearLayout {
private ListView lvAlarmList;
private Button btnAddAlarm;
private ArrayAdapter<AlarmData> adapter;
private static final String KEY_ALARM_LIST = "alarmList";
private AlarmManager alarmManager;
@SuppressLint("NewApi")
public AlarmView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public AlarmView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public AlarmView(Context context) {
super(context);
init();
}
public void init() {
alarmManager = (AlarmManager) getContext().getSystemService(
Context.ALARM_SERVICE);
}
private void addAlarm() {
Calendar c = Calendar.getInstance();
new TimePickerDialog(getContext(),
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay,
int minute) {
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, hourOfDay);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
AlarmData ad;
if (c.getTimeInMillis() > System.currentTimeMillis()) {
// 设置时间大于当前时间
ad = new AlarmData(c.getTimeInMillis());
} else {
// 设置时间小于当前时间 日期加一天
ad = new AlarmData(
c.getTimeInMillis() + 24 * 3600 * 1000);
}
adapter.add(ad);
Intent intent = new Intent(getContext(),
AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(
getContext(), ad.getId(), intent, 0);
/*
* 指定的任务只会执行一次,如果该pendingIntent指定的任务已经被执行过了,那么该方法直接会被cancel掉。
* set(int type, long triggerAtTime, PendingIntent operation)
* type 指定定时模式。
* triggerAtTime 触发任务的时间。该参数和定时模式息息相关
* operation 该参数指定一个广播Intent,当时间到了时,系统会广播里面的intent,触发相应的广播接收者执行某些操作,比如响铃……
*/
alarmManager.set(AlarmManager.RTC_WAKEUP, ad.getTime(), pi);
/*
* 通过该方法指定的任务会一直间隔执行,第三个参数就指定了执行的时间间隔
如果我们想取消的话,请使用:alarmManager.cancel(pendingIntent);
注意,这里的pendingIntent要和setRepeating方法中的一致哦。
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,ad.getTime(), 5 * 60 * 1000, pi);
*/
saveAlarmList();
}
}, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true)
.show();
}
public void saveAlarmList() {
SharedPreferences sharedPreferences = getContext()
.getSharedPreferences(AlarmView.class.getName(),
Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < adapter.getCount(); i++) {
sb.append(adapter.getItem(i).getTime()).append(",");
}
if (sb.length() > 1) {
String content = sb.substring(0, sb.length() - 1);
editor.putString(KEY_ALARM_LIST, content);
System.out.println("-------------------------------" + content);
} else {
editor.putString(KEY_ALARM_LIST, null);
}
editor.commit();
}
private void readSavedAlarmList() {
SharedPreferences sharedPreferences = getContext()
.getSharedPreferences(AlarmView.class.getName(),
Context.MODE_PRIVATE);
String content = sharedPreferences.getString(KEY_ALARM_LIST, null);
if (content != null) {
String[] timeStrings = content.split(",");
for (String string : timeStrings) {
adapter.add(new AlarmData(Long.parseLong(string)));
}
}
}
private void deleteAlarm(int position) {
AlarmData ad = adapter.getItem(position);
adapter.remove(ad);
saveAlarmList();
alarmManager.cancel(PendingIntent.getBroadcast(getContext(),
ad.getId(), new Intent(getContext(), AlarmReceiver.class), 0));
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
btnAddAlarm = (Button) findViewById(R.id.btnAddAlarm);
lvAlarmList = (ListView) findViewById(R.id.lvAlarmList);
adapter = new ArrayAdapter<AlarmView.AlarmData>(getContext(),
android.R.layout.simple_list_item_1);
lvAlarmList.setAdapter(adapter);
readSavedAlarmList();
// adapter.add(new AlarmData(System.currentTimeMillis()));
btnAddAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addAlarm();
saveAlarmList();
}
});
lvAlarmList
.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0,
View arg1, final int position, long id) {
AlertDialog.Builder alert = new AlertDialog.Builder(
getContext());
alert.setTitle("操作选项");
alert.setMessage("删除这个选项?");
alert.setPositiveButton("是",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
deleteAlarm(position);
}
});
alert.setNegativeButton("否", null);
alert.show();
return true;
}
});
}
private static class AlarmData {
private long time;
private String timeLabel;
private Time t;
public AlarmData(long time) {
this.time = time;
t = new Time();
t.set(time);
timeLabel = (t.month + 1) + "月" + t.monthDay + "日 " + t.hour + ":"
+ t.minute;
}
public long getTime() {
return time;
}
public String getTimeLabel() {
return timeLabel;
}
public int getId() {
return (int) (getTime() / 1000 / 60);
}
@Override
public String toString() {
return timeLabel;
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("闹钟实行----------------------------");
AlarmManager am = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
// 取消alarm使用AlarmManager.cancel()函数,传入参数是个PendingIntent实例。该函数会将所有跟这个PendingIntent相同的Alarm全部取消
am.cancel(PendingIntent.getBroadcast(context, getResultCode(),
new Intent(context, AlarmView.class), 0));
Intent i = new Intent(context, PlayAlarmAty.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
public class PlayAlarmAty extends Activity {
private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alarm_player_aty);
mp = MediaPlayer.create(this, R.raw.music);
mp.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
mp.stop();
mp.release();
}
@Override
protected void onPause() {
super.onPause();
finish();
}
}