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);
        }
    }
}

搜索

复制

相关