AlarmView.java 需要判断时间到了需要触发事件,需要播放音乐和震动。所以播放音乐和震动放在另一个活动中(PlayAlarmAty.java )
public class AlarmView extends LinearLayout {
private Button btnAddAlarm;
private ListView lvAlarmList;
private ArrayAdapter mAdapter;
private static final String KEY_ALARM_LIST = "alarmList";
// 使用系统的闹钟服务
private AlarmManager mAlarmManager;
public AlarmView(Context context) {
super(context);
init();
}
public AlarmView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init(){
// 使用闹钟服务设定闹钟
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
}
// 在初始化之后进行的操作
@Override
protected void onFinishInflate() {
super.onFinishInflate();
btnAddAlarm = (Button)findViewById(R.id.btnAddAlarm);
lvAlarmList = (ListView) findViewById(R.id.lvAlarmList);
// 系统的简单资源
mAdapter = new ArrayAdapter(getContext(),android.R.layout.simple_list_item_1);
// 设置Adapter
lvAlarmList.setAdapter(mAdapter);
// 读取已经存储在SharedPreferences中的数据
readSavedAlarmList();
btnAddAlarm.setOnClickListener(new View.OnClickListener() {// 添加闹钟的点击事件
@Override
public void onClick(View v) {
addAlarm();
}
});
// 删除闹钟
lvAlarmList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,final int position, long id) {
new AlertDialog.Builder(getContext()).setTitle("操作选项").setItems(new CharSequence[]{"删除"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case 0:
deleteAlarm(position);
break;
default:
break;
}
}
}).setNegativeButton("取消",null).show();
return true;
}
});
}
// 删除闹钟
private void deleteAlarm(int position){
AlarmData ad = mAdapter.getItem(position);
// 把闹钟从闹钟列表移除
mAdapter.remove(ad);
saveAlarmList();
// 移除闹钟
mAlarmManager.cancel(PendingIntent.getBroadcast(getContext(),ad.getId(),new Intent(getContext(),AlarmReceiver.class),0));
}
// 添加闹钟
private void addAlarm(){
// 获取当前时间
Calendar c = Calendar.getInstance();
// 弹出一个时间的选择框
new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {
// 设置时间
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// 获取当前时间
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); // 毫秒值清零
// 如果设置闹钟时间小于当前时间,则往后推一天
Calendar currentTime = Calendar.getInstance();
if (calendar.getTimeInMillis() <= currentTime.getTimeInMillis()){
calendar.setTimeInMillis(calendar.getTimeInMillis()+24*60*60*1000);
}
AlarmData ad = new AlarmData(calendar.getTimeInMillis());
mAdapter.add(ad);
//需要根据API版本来判断调用,从Android4.4(API19)开始,为了节能省电(减少系统唤醒和电池使用)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mAlarmManager.setWindow(AlarmManager.RTC_WAKEUP,
ad.getTime(),
100, // 时间误差范围 100毫秒
PendingIntent.getBroadcast(getContext(), ad.getId(),
new Intent(getContext(), AlarmReceiver.class), 0));
} else {
mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
ad.getTime(),
5*60*1000,
PendingIntent.getBroadcast(getContext(), ad.getId(),
new Intent(getContext(), AlarmReceiver.class), 0));
}
saveAlarmList();
}
},c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show();
}
// 存储数据(存到SharedPreferences中)
private void saveAlarmList(){
SharedPreferences.Editor editor = getContext().getSharedPreferences(AlarmView.class.getName(),Context.MODE_PRIVATE).edit();
// 存储数据(for循环遍历Adapter)
StringBuffer sb = new StringBuffer();
//getCount表示这个adapter里面有多少item,就是有多少闹钟
for (int i = 0 ; i < mAdapter.getCount(); i++){
sb.append(mAdapter.getItem(i).getTime()).append(",");
}
// 所有的值传进去之后 去掉最后的逗
if (sb.length() > 1){
String content = sb.toString().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 sp = getContext().getSharedPreferences(AlarmView.class.getName(),Context.MODE_PRIVATE);
String content = sp.getString(KEY_ALARM_LIST,null);
// 这里需要判断,不然没闹钟数据的时候会有空指针异常
if (content != null){
//这里取得每一个闹钟的time添加到数组里
String[] timeStrings = content.split(",");
// 遍历数组,把数据添加到mAdapter
for (String string : timeStrings){
mAdapter.add(new AlarmData(Long.parseLong(string)));
}
}
}
//闹钟的数据,用一个类要保存,这是常用的做法
private static class AlarmData{
private long time = 0;
private String timeLabel = ""; // 在外界获取时间的标签的字符串
private Calendar date;
// 闹钟响起的时间
public AlarmData(long time){
this.time = time;
date = Calendar.getInstance();
date.setTimeInMillis(time);
timeLabel = String.format("%d月%d日 %d:%d",
date.get(Calendar.MONTH)+1,
date.get(Calendar.DAY_OF_MONTH),
date.get(Calendar.HOUR_OF_DAY),
date.get(Calendar.MINUTE));
}
public AlarmData(String ad){
this.timeLabel = ad;
}
public void setTime(long time){
this.time = time;
}
public long getTime(){
return time;
}
public void setTimeLable(String timeLable){
this.timeLabel = timeLable;
}
@Override
public String toString() {
return getTimeLabel();
}
public String getTimeLabel() {
return timeLabel;
}
//为了给每一个闹钟设定一个标识,方便取消闹钟的使用能知道是哪一个闹钟
public int getId(){
return (int) (getTime()/1000/60);
}
}
}
搜索
复制