AlarmView.java 需要判断时间到了需要触发事件,需要播放音乐和震动。所以播放音乐和震动放在另一个活动中(PlayAlarmAty.java )
public class AlarmView extends LinearLayout { private Button btnAddAlarm; private ListView lvAlarmList; private ArrayAdaptermAdapter; 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); } } }
搜索
复制