Android开发之自定义闹钟实现

自定义定时闹钟开发

Android-自定义设置闹钟

闹钟时间设置及显示

闹钟的布局很简单,就是一个简单时间设置,所以自己写一个简单的布局按钮之类的也可以了,不过多赘述。另外使用时间对话框 TimePickerDialog 去设置时间,用 Calendar可获取当前系统的时间。 AlertDialog.THEME_HOLO_LIGHT是设置dialog的样式,不设置的话就是一个默认的圆形时钟,设置这个之后是一个可滚动上下滑动的时钟样式。代码展示:

      //设置时间事件的点击
            Calendar c = Calendar.getInstance();
            // 创建一个TimePickerDialog实例,并把它显示出来。
            new TimePickerDialog(mContext,  AlertDialog.THEME_HOLO_LIGHT,
                    // 绑定监听器
                    (tp, hourOfDay, minute) -> {
                        try {
                            if (hourOfDay > 22 || hourOfDay < 5) {
                                Toast.makeText(mContext,"23:00~04:59&#xFF0C;&#x8981;&#x597D;&#x597D;&#x7761;&#x89C9;&#x7684;&#xFF0C;&#x8FD9;&#x662F;&#x957F;&#x8EAB;&#x4F53;&#x7684;&#x9EC4;&#x91D1;&#x65F6;&#x95F4;&#x54E6;~", Toast.LENGTH_LONG).show();
                            } else {
                            //&#x4E00;&#x4E2A;&#x8865;&#x5168;&#x663E;&#x793A;&#x7684;&#x65F6;&#x95F4;
                                if(hourOfDay < 10 && minute > 10) {
                                    String times = "0" + hourOfDay + ":" + minute;
                                    tv_play.setText(times);
                                }else if(minute < 10 && hourOfDay < 10) {
                                    String times = "0" + hourOfDay + ":" +  "0"+ minute;
                                    tv_play.setText(times);
                                } else if(minute < 10) {
                                    String times = hourOfDay + ":" +  "0" + minute;
                                    tv_play.setText(times);
                                } else {
                                    String times = hourOfDay + ":" + minute;
                                    tv_play.setText(times);
                                }
                                mDate = tv_play.getText().toString();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    //&#x8BBE;&#x7F6E;&#x521D;&#x59CB;&#x65F6;&#x95F4;
                    , c.get(Calendar.HOUR_OF_DAY)
                    , c.get(Calendar.MINUTE)
                    //true&#x8868;&#x793A;&#x91C7;&#x7528;24&#x5C0F;&#x65F6;&#x5236;
                    , true).show();

默认样式

Android开发之自定义闹钟实现
可滚动样式
Android开发之自定义闹钟实现
设定好的时钟布局显示,在这个主页面上看个人喜欢怎样的布局,可用listview或recycleview实现。在这里我使用的是recycleView+gridlayoutManager显示网格布局,一行两个卡片展示。使用适配器去匹配recycleview会更好,因为这样操作方便且美观。
Android开发之自定义闹钟实现

闹钟增删改查

sqlite是一个安卓自带的轻量级数据库。增删改查都是对数据库的操作行为,另外使用sqlite去存储时钟的数据,就可以防止数据的丢失,因此可以在时钟的基础上做一个计划提醒之类的,可以把计划里的内容存储进数据库里,还有时间。可以在建立数据表的时候自带一个自增的id,方便操作。数据库的建表这些可以去搜索编写,很简单,因此不多赘述。

/**
 * &#x8F6C;&#x50A8;&#x6570;&#x636E;,&#x5199;&#x6570;&#x636E;&#x5230;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#xFF0C;&#x589E;&#x52A0;&#x6570;&#x636E;
 * @param sqLiteDatabase &#x6570;&#x636E;&#x5E93;
 * @param context &#x5185;&#x5BB9;
 * @param repeat &#x91CD;&#x590D;
 * @param date &#x65F6;&#x95F4;
 * @param count &#x65F6;&#x957F;
 */
private void insertData(SQLiteDatabase sqLiteDatabase, String context, String repeat,
                       String date, String count){
    try {
        ContentValues values = new ContentValues();
        values.put("context", context);
        values.put("repeat", repeat);
        values.put("time", date);
        values.put("count", count);
        sqLiteDatabase.insert("data",null, values);//&#x65B0;&#x589E;&#x529F;&#x80FD;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * &#x4FEE;&#x6539;&#x6570;&#x636E;,&#x5199;&#x6570;&#x636E;&#x5230;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#xFF0C;&#x589E;&#x52A0;&#x6570;&#x636E;
 * @param sqLiteDatabase &#x6570;&#x636E;&#x5E93;
 * @param context &#x5185;&#x5BB9;
 * @param repeat &#x91CD;&#x590D;
 * @param date &#x65F6;&#x95F4;
 * @param count &#x65F6;&#x957F;
 */
private void updateData(SQLiteDatabase sqLiteDatabase, String context, String repeat,
                       String date, String count){
    try {
        ContentValues values = new ContentValues();
        values.put("context", context);
        values.put("repeat", repeat);
        values.put("time", date);
        values.put("count", count);
      sqLiteDatabase.update("data",values,"id=?",new String[]{String.valueOf(mId)});//&#x4FEE;&#x6539;&#x529F;&#x80FD;
    } catch (Exception e) {
        e.printStackTrace();
    }
}
/**
 * &#x5220;&#x9664;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684;&#x6570;&#x636E;
 * @param sqLiteDatabase &#x6570;&#x636E;&#x5E93;
 * @param id id
 */
private void deleteData(SQLiteDatabase sqLiteDatabase, int id) {
    try {
        sqLiteDatabase.delete("data","id=?",new String[]{String.valueOf(id)});
    } catch (Exception e) {
        e.printStackTrace();
    }
}

闹钟开启

在上面的布局里,可以看到有个按键,点击它即可开启闹钟提醒,关闭它即可关闭闹钟提醒。开启闹钟的提示函数如下,将获取的时间去与系统当前时间比较,AlarmManager设置提醒。关闭闹钟就是一个简单的AlarmManager取消行为。那个提醒类就是平时见到的那种简单的dialog提醒,所以不再次赘述。

/**
 * &#x5F00;&#x542F;&#x95F9;&#x949F;
 * @param parent &#x7236;&#x7C7B;
 * @param hour &#x5C0F;&#x65F6;
 * @param minute &#x5206;&#x949F;
 * @param position &#x4F4D;&#x7F6E;
 */
private void startAlarm(ViewGroup parent, int hour, int minute, int position) {
    try {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.currentTimeMillis());//&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x65F6;&#x95F4;
        //&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x6BEB;&#x79D2;&#x503C;
        long systemTime = System.currentTimeMillis();
        c.setTimeZone(TimeZone.getTimeZone("GMT+8"));//&#x8BBE;&#x7F6E;&#x65F6;&#x533A;
        c.set(Calendar.HOUR_OF_DAY, hour);//&#x8BBE;&#x7F6E;&#x51E0;&#x70B9;&#x63D0;&#x9192;
        c.set(Calendar.MINUTE, minute);//&#x8BBE;&#x7F6E;&#x51E0;&#x5206;&#x63D0;&#x9192;
        //&#x83B7;&#x53D6;&#x4E0A;&#x9762;&#x8BBE;&#x7F6E;&#x7684;&#x65F6;&#x95F4;
        long selectTime = c.getTimeInMillis();
        // &#x5982;&#x679C;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x5927;&#x4E8E;&#x8BBE;&#x7F6E;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x4ECE;&#x7B2C;&#x4E8C;&#x5929;&#x7684;&#x8BBE;&#x5B9A;&#x65F6;&#x95F4;&#x5F00;&#x59CB;
        if (systemTime > selectTime) {
            c.add(Calendar.DAY_OF_MONTH, 1);
        }
        /* &#x95F9;&#x949F;&#x65F6;&#x95F4;&#x5230;&#x4E86;&#x7684;&#x4E00;&#x4E2A;&#x63D0;&#x9192;&#x7C7B; */
        Intent intent = new Intent(parent.getContext(), ListenerActivity.class);
        @SuppressLint("UnspecifiedImmutableFlag")
        PendingIntent pi = PendingIntent.getActivity(parent.getContext(), 0, intent, 0);
        //&#x5F97;&#x5230;AlarmManager&#x5B9E;&#x4F8B;
        AlarmManager am = (AlarmManager)parent.getContext().getSystemService(ALARM_SERVICE);
        //&#x91CD;&#x590D;&#x63D0;&#x9192;
        am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 60*60*1000*24, pi);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
   /**
 * &#x5173;&#x95ED;&#x63D0;&#x9192;
 * @param parent &#x7236;&#x7C7B;
 */
private void stopRemind(ViewGroup parent) {
    try {
        Intent intent = new Intent(parent.getContext(), ListenerActivity.class);
        @SuppressLint("UnspecifiedImmutableFlag")
        PendingIntent pi = PendingIntent.getActivity(parent.getContext(), 0,
                intent, 0);
        AlarmManager am = (AlarmManager)parent.getContext().getSystemService(ALARM_SERVICE);
        //&#x53D6;&#x6D88;&#x63D0;&#x9192;
        am.cancel(pi);
        Toast.makeText(parent.getContext(), "&#x5173;&#x95ED;&#x4E86;&#x63D0;&#x9192;", Toast.LENGTH_SHORT).show();
        Intent intents = new Intent("android.intent.action.BOOKCASE_RESTART");
        @SuppressLint("UnspecifiedImmutableFlag")
        PendingIntent pis = PendingIntent.getBroadcast(parent.getContext(), 0,
                intents, 0);
        AlarmManager ams = (AlarmManager)parent.getContext().getSystemService(ALARM_SERVICE);
        //&#x53D6;&#x6D88;&#x63D0;&#x9192;
        ams.cancel(pis);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

总结

这是本人最近写的一个自定义闹钟提醒,代码并不是全部代码,但是主要的函数以及内容都以及在上面阐述了。小小的尝试了一下,代码写的也不是特别的好,但是功能效果也是实现了的,在这里记录一下思路还有代码,做一个学习笔记。希望各位大佬们多指教,也希望能给大家带来一些灵感。

Original: https://blog.csdn.net/Dream_fan/article/details/120193510
Author: Dream_fan
Title: Android开发之自定义闹钟实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816450/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球