Android自定义定时闹钟开发
作者:Dream_fan 发布时间:2023-07-07 00:18:01
本文实例为大家分享了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,要好好睡觉的,这是长身体的黄金时间哦~", Toast.LENGTH_LONG).show();
} else {
//一个补全显示的时间
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();
}
}
//设置初始时间
, c.get(Calendar.HOUR_OF_DAY)
, c.get(Calendar.MINUTE)
//true表示采用24小时制
, true).show();
默认样式
可滚动样式
设定好的时钟布局显示,在这个主页面上看个人喜欢怎样的布局,可用listview或recycleview实现。在这里我使用的是recycleView+gridlayoutManager显示网格布局,一行两个卡片展示。使用适配器去匹配recycleview会更好,因为这样操作方便且美观。
闹钟增删改查
sqlite是一个安卓自带的轻量级数据库。增删改查都是对数据库的操作行为,另外使用sqlite去存储时钟的数据,就可以防止数据的丢失,因此可以在时钟的基础上做一个计划提醒之类的,可以把计划里的内容存储进数据库里,还有时间。可以在建立数据表的时候自带一个自增的id,方便操作。数据库的建表这些可以去搜索编写,很简单,因此不多赘述。
/**
* 转储数据,写数据到数据库中,增加数据
* @param sqLiteDatabase 数据库
* @param context 内容
* @param repeat 重复
* @param date 时间
* @param count 时长
*/
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);//新增功能
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 修改数据,写数据到数据库中,增加数据
* @param sqLiteDatabase 数据库
* @param context 内容
* @param repeat 重复
* @param date 时间
* @param count 时长
*/
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)});//修改功能
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除数据库中的数据
* @param sqLiteDatabase 数据库
* @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提醒,所以不再次赘述。
/**
* 开启闹钟
* @param parent 父类
* @param hour 小时
* @param minute 分钟
* @param position 位置
*/
private void startAlarm(ViewGroup parent, int hour, int minute, int position) {
try {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());//获取当前时间
//获取当前毫秒值
long systemTime = System.currentTimeMillis();
c.setTimeZone(TimeZone.getTimeZone("GMT+8"));//设置时区
c.set(Calendar.HOUR_OF_DAY, hour);//设置几点提醒
c.set(Calendar.MINUTE, minute);//设置几分提醒
//获取上面设置的时间
long selectTime = c.getTimeInMillis();
// 如果当前时间大于设置的时间,那么就从第二天的设定时间开始
if (systemTime > selectTime) {
c.add(Calendar.DAY_OF_MONTH, 1);
}
/* 闹钟时间到了的一个提醒类 */
Intent intent = new Intent(parent.getContext(), ListenerActivity.class);
@SuppressLint("UnspecifiedImmutableFlag")
PendingIntent pi = PendingIntent.getActivity(parent.getContext(), 0, intent, 0);
//得到AlarmManager实例
AlarmManager am = (AlarmManager)parent.getContext().getSystemService(ALARM_SERVICE);
//重复提醒
am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 60*60*1000*24, pi);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 关闭提醒
* @param parent 父类
*/
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);
//取消提醒
am.cancel(pi);
Toast.makeText(parent.getContext(), "关闭了提醒", 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);
//取消提醒
ams.cancel(pis);
} catch (Exception e) {
e.printStackTrace();
}
}
总结
这是本人最近写的一个自定义闹钟提醒,代码并不是全部代码,但是主要的函数以及内容都以及在上面阐述了。小小的尝试了一下,代码写的也不是特别的好,但是功能效果也是实现了的,在这里记录一下思路还有代码,做一个学习笔记。希望各位大佬们多指教,也希望能给大家带来一些灵感。
来源:https://blog.csdn.net/Dream_fan/article/details/120193510
猜你喜欢
- 本文实例为大家分享了unity实现场景切换进度条显示的具体代码,供大家参考,具体内容如下一、UI。建立slider适当更改即可;二、新增lo
- 目录前沿快速开始引入依赖定义接口配置类开始调用json序列化接口层面指定header:指定Encoder跟Decoder使用 * 注解详解@
- 经常要检测某些IP地址范围段的计算机是否在线。有很多的方法,比如进入到网关的交换机上去查询、使用现成的工具或者编写一个简单的DOS脚本等等,
- 概念是利用锁的机制来实现同步的。互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一
- 一个线程如何知道另一线程已经结束?Thread类提供了回答此问题的方法。有两种方法可以判定一个线程是否结束。第一,可以在线程中调用isAli
- 一:在springboot中使用事物遇到的坑1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物。顾名思义,编程式事
- 一、新时间日期API常用、重要对象介绍ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则Instan
- 前言App安全非常重要,尤其是数据安全。但是我们知道通过Charles等工具可以对App的网络请求进行抓包,如果我们的数据没有进行加密,这样
- 详解Java对象的强、软、弱和虚引用+ReferenceQueue一、强引用(StrongReference)强引用是使用最普遍的引用。如果
- 前言等待总是让人感到焦急和厌烦的,特别是看不到进展的等待。所以为了不让用户痴痴地等,我们在进行某些耗时操作时,一般都要设计一个进度条或者倒计
- 大家最近都在讨论新鲜技术-flutter,小编也在学习中,遇到大家都遇到的问题,底部导航。下面给大家贴出底部导航的编写,主要参考了lime这
- 调整数组顺序使奇数位于偶数之前1. 题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的
- 前言一说到Socket,想必大家都或多或少有所涉及,从最初的计算机网络课程,讲述了tcp协议,而Socket就是对协议的进一步封装,使我们开
- 在jdk文档中对RandomAccess接口的定义如下: public interface RandomAccess下面是jdk
- 什么是命名查询? Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询 使用命名查询有什么好处? 由于使用H
- 最近发现Java原生的Zip压缩组件在压缩过程中,不支持文件名的中文编码,会在压缩过程中把中文文件名变成乱码。Apache的ant包中的压缩
- 通过子类调用父类的变量,有两种方法:1、把父类的变量设置成public:package triangle.opengl.wlz.stu.ch
- 本文实例讲述了Android编程基于重力传感器实现横竖屏放向切换功能。分享给大家供大家参考,具体如下:最近项目中用到了vr视频播放,因为自己
- 判断某字符串是否为空,为空的标准是str==null或str.length()==01.下面是StringUtils判断是否为空的示例:St
- 为方便自己以后学习,自己记录学习,大家也可以参考,有什么问题一起探讨。今天学习RecyclerView,下边来说一下实现数据垂直滚动和数据横