Android开发一个闹钟

最新2019年10月7日(趁着国庆有时间)更新了一波,界面好看了很多,但还是有很多地方不完善,以后抽时间再次更新

不完善的地方:

不能同时开多个闹钟,这个有点困难,有想法的同学可以告我怎么做

后台程序无法长期保存,这个应该没有办法解决,因为不是系统级别的应用

所以只是用来学习交流的,主要掌握定时器的用法就行了

效果图如图:

顺便说一下我用得编译器是Android Studio 

下面讲解一下关键的几个步骤:(并非全部代码)

首先我用的是Litepal数据库

所以先新建了一个表

public class Clock extends DataSupport {
    public static final int clock_open = 1;
    public static final int clock_close = 0;

    String hour;
    String minute;
    String content;
    int  ClockType;

    public String getMinute() {
        return minute;
    }

    public String getHour() {
        return hour;
    }

    public void setHour(String hour) {
        this.hour = hour;
    }

    public void setMinute(String minute) {
        this.minute = minute;
    }

    public int getClockType() {
        return ClockType;
    }

    public void setClockType(int clockType) {
        ClockType = clockType;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }


}

然后比较重要的代码修改,保存和删除(这里用了定时器服务,会在指定时间发出广播)

case R.id.set_time:
                calendar.setTimeInMillis(System.currentTimeMillis());
                int mhour = calendar.get(Calendar.HOUR_OF_DAY);
                int mminute = calendar.get(Calendar.MINUTE);
                new TimePickerDialog(ClockDetail.this, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        //calendar.setTimeInMillis(System.currentTimeMillis());
                        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
                        calendar.set(Calendar.MINUTE, minute);
                        calendar.set(Calendar.SECOND, 0);
                        calendar.set(Calendar.MILLISECOND, 0);
                        hourformat = format(hourOfDay);
                        minuteformat = format(minute);
                        Toast.makeText(ClockDetail.this, "" + hourformat + ":" + minuteformat, Toast.LENGTH_SHORT).show();
                        show_hour.setText(hourformat);
                        show_minute.setText(minuteformat);
                    }
                }, mhour, mminute, true).show();
                break;
            case R.id.save:
                clock.setHour(hourformat);
                clock.setMinute(minuteformat);
                clock.setContent("" + content.getText().toString());
                clock.setClockType(Clock.clock_open);
                clock.save();
                Intent intent = new Intent(ClockDetail.this, CallAlarm.class);
               // intent.putExtra("content",clock.getContent());
                //sendBroadcast(intent);
                PendingIntent sender = PendingIntent.getBroadcast(
                        ClockDetail.this, 0, intent, 0);
                AlarmManager am;
                am = (AlarmManager) getSystemService(ALARM_SERVICE);
                Log.e("gethour",clock.getHour());
                Log.e("gethour",clock.getMinute());
                calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(clock.getHour()));
                calendar.set(Calendar.MINUTE, Integer.parseInt(clock.getMinute()));
                Log.e("TAG",calendar.getTimeInMillis()+"");
                Log.e("TAG",System.currentTimeMillis()+"");
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    if (System.currentTimeMillis()>calendar.getTimeInMillis()+60000){
                        //加24小时
                        am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()+86400000, sender);
                    }else {
                        am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
                    }
                }

                timeAdapter.notifyDataSetChanged();
                finish();
                break;
            case R.id.delete:
                clock.delete();
                timeAdapter.notifyDataSetChanged();
                Intent intent1 = new Intent(context, CallAlarm.class);
                PendingIntent sender1=PendingIntent.getBroadcast(
                        context,0, intent1, 0);
                am =(AlarmManager)context.getSystemService(ALARM_SERVICE);
                am.cancel(sender1);
                finish();
                break;

广播接受者(接收指定时间发过来的广播)

public class CallAlarm extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent intent1 = new Intent(context,AlarmAlert.class);
        Bundle bundle = new Bundle();
        bundle.putString("STR_CALLER","");
        intent1.putExtras(bundle);
        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent1);
    }
}

收到广播后会跳转到这里 

public class AlarmAlert extends Activity {
    private MediaPlayer mediaPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        int position = getIntent().getIntExtra("position",-1);
        mediaPlayer = MediaPlayer.create(this,R.raw.clockmusic2);
        mediaPlayer.start();
        new AlertDialog.Builder(AlarmAlert.this)
                .setIcon(R.drawable.clock)
                .setTitle("闹钟响了")
                .setCancelable(false)
                .setMessage("时间到了!")
                .setPositiveButton("关掉"
                        , new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                AlarmAlert.this.finish();
                                mediaPlayer.stop();
                            }
                        }).show();
    }
}

最后再贴一下Adapter里的代码吧,感觉这块的逻辑也挺重要的

package com.example.dell.alarmalert_csdn;


public class TimeAdapter extends RecyclerView.Adapter<TimeAdapter.ViewHolder> {
    List<Clock> list;
    LayoutInflater layoutInflater;
    Context context;
    Calendar calendar = Calendar.getInstance();
    public static int pos;



    public TimeAdapter(List<Clock> list, Context context) {
        this.list = list;
        this.context = context;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public TimeAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = layoutInflater.inflate(R.layout.clockitem, null);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @SuppressLint({"ResourceAsColor", "SetTextI18n"})
    @Override
    public void onBindViewHolder(@NonNull final TimeAdapter.ViewHolder viewHolder, final int i) {
        final Clock clock = list.get(i);
        pos = i;

        Log.e("i=======",i+"  "+clock.getClockType());
        if (clock.getClockType() == Clock.clock_open){
            viewHolder.aSwitch.setChecked(true);
            viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorBlack));
            viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorBlack));
            viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorBlack));
            viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorBlack));
        }else if (clock.getClockType() == Clock.clock_close){
            viewHolder.aSwitch.setChecked(false);
            viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorGray));
            viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorGray));
            viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorGray));
            viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorGray));
        }
        viewHolder.hour.setText(clock.getHour()+"");
        viewHolder.minute.setText(clock.getMinute()+"");

        viewHolder.content.setText(clock.getContent());
        viewHolder.todetail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("TODETAIL",clock.getClockType()+"");
                Intent intent = new Intent(context, ClockDetail.class);
                intent.putExtra("position", i);
                context.startActivity(intent);
            }
        });

        viewHolder.aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @SuppressLint("ResourceAsColor")
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    clock.setClockType(Clock.clock_open);
                    //clock.updateAll();
                    clock.save();
                    Toast.makeText(context, "开启闹钟", Toast.LENGTH_SHORT).show();
                    viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorBlack));
                    viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorBlack));
                    viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorBlack));
                    viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorBlack));
                    Intent intent = new Intent(context, CallAlarm.class);
                    PendingIntent sender = PendingIntent.getBroadcast(
                            context, 0, intent, 0);
                    AlarmManager am;
                    am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
                    calendar.setTimeInMillis(System.currentTimeMillis());
                    calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(clock.getHour()));
                    calendar.set(Calendar.MINUTE, Integer.parseInt(clock.getMinute()));
                    calendar.set(Calendar.SECOND, 0);
                    calendar.set(Calendar.MILLISECOND, 0);
                    Log.e("TAG",calendar.getTimeInMillis()+"");
                    Log.e("TAG",System.currentTimeMillis()+"");
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                        if (System.currentTimeMillis()>calendar.getTimeInMillis()+40000){
                            //加24小时
                            am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()+86400000, sender);
                        }else {
                            am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
                        }
                    }
                } else if (!isChecked){
                    clock.setClockType(Clock.clock_close);
                    //clock.updateAll();
                    clock.save();
                    Log.e("status------",clock.getHour()+clock.getMinute()+clock.getMinute()+clock.getClockType()+"");

                    Log.e("关闭闹钟",clock.getClockType()+"");
                    Intent intent = new Intent(context, CallAlarm.class);
                    PendingIntent sender=PendingIntent.getBroadcast(
                            context,0, intent, 0);
                    AlarmManager am;
                    am =(AlarmManager)context.getSystemService(ALARM_SERVICE);
                    am.cancel(sender);
                    Toast.makeText(context, "关闭闹钟", Toast.LENGTH_SHORT).show();
                    viewHolder.hour.setTextColor(context.getResources().getColor(R.color.colorGray));
                    viewHolder.minute.setTextColor(context.getResources().getColor(R.color.colorGray));
                    viewHolder.net.setTextColor(context.getResources().getColor(R.color.colorGray));
                    viewHolder.content.setTextColor(context.getResources().getColor(R.color.colorGray));
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView hour;
        TextView minute;
        TextView content;
        TextView net;
        Switch aSwitch;
        LinearLayout todetail;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            hour = itemView.findViewById(R.id.hour);
            minute = itemView.findViewById(R.id.minute);
            net = itemView.findViewById(R.id.net);
            content = itemView.findViewById(R.id.content_item);
            aSwitch = itemView.findViewById(R.id.switch_control);
            todetail = itemView.findViewById(R.id.todetail);
        }
    }
}

 源码下载地址

GitHub地址https://github.com/jh360twb/Alarmalert-csdn

CSDN积分下载Alarmalert-csdn_2.rar_android闹钟开发-Android代码类资源-CSDN下载

  • 28
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值