網站首頁 編程語言 正文
本文實例為大家分享了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
相關推薦
- 2022-09-10 PyCharm:method?may?be?static問題及解決_python
- 2022-03-14 IDEA 上傳文件 getRealpath("/upload)獲取不到文件上傳路徑問題
- 2022-04-19 C語言庫函數qsort及bsearch快速排序算法使用解析_C 語言
- 2024-07-15 SpringBoot使用EasyExcel導出Excel(含設置下拉框、表頭凍結)
- 2022-10-06 Python?PaddlePaddle機器學習之求解線性模型_python
- 2023-10-17 el-table-column 表單table的后端返回時間戳的轉換
- 2022-10-23 C#使用Lazy<T>實現對客戶訂單的延遲加載_C#教程
- 2023-04-14 python使用pyodbc連接sqlserver_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支