Android自定義定時(shí)鬧鐘開(kāi)發(fā)
本文實(shí)例為大家分享了Android開(kāi)發(fā)之自定義鬧鐘實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
鬧鐘時(shí)間設(shè)置及顯示
鬧鐘的布局很簡(jiǎn)單,就是一個(gè)簡(jiǎn)單時(shí)間設(shè)置,所以自己寫(xiě)一個(gè)簡(jiǎn)單的布局按鈕之類(lèi)的也可以了,不過(guò)多贅述。另外使用時(shí)間對(duì)話(huà)框TimePickerDialog 去設(shè)置時(shí)間,用Calendar可獲取當(dāng)前系統(tǒng)的時(shí)間。AlertDialog.THEME_HOLO_LIGHT是設(shè)置dialog的樣式,不設(shè)置的話(huà)就是一個(gè)默認(rèn)的圓形時(shí)鐘,設(shè)置這個(gè)之后是一個(gè)可滾動(dòng)上下滑動(dòng)的時(shí)鐘樣式。代碼展示:
//設(shè)置時(shí)間事件的點(diǎn)擊 Calendar c = Calendar.getInstance(); // 創(chuàng)建一個(gè)TimePickerDialog實(shí)例,并把它顯示出來(lái)。 new TimePickerDialog(mContext, ?AlertDialog.THEME_HOLO_LIGHT, ? ? ? // 綁定監(jiān)聽(tīng)器 ? ? ? (tp, hourOfDay, minute) -> { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? if (hourOfDay > 22 || hourOfDay < 5) { ? ? ? ? ? ?? ? ? Toast.makeText(mContext,"23:00~04:59,要好好睡覺(jué)的,這是長(zhǎng)身體的黃金時(shí)間哦~", Toast.LENGTH_LONG).show(); ? ? ? ? ? ? ? ?? } else { ? ? ? ? //一個(gè)補(bǔ)全顯示的時(shí)間 ? ? ? ? ? ? ? ? ? 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(); ? ? ? ? ? ? } ? ? ? } ? ? //設(shè)置初始時(shí)間 ? ? ? ? , c.get(Calendar.HOUR_OF_DAY) ? ? ? ? , c.get(Calendar.MINUTE) ? ? ? //true表示采用24小時(shí)制 ? , true).show();
默認(rèn)樣式
可滾動(dòng)樣式
設(shè)定好的時(shí)鐘布局顯示,在這個(gè)主頁(yè)面上看個(gè)人喜歡怎樣的布局,可用listview或recycleview實(shí)現(xiàn)。在這里我使用的是recycleView+gridlayoutManager顯示網(wǎng)格布局,一行兩個(gè)卡片展示。使用適配器去匹配recycleview會(huì)更好,因?yàn)檫@樣操作方便且美觀(guān)。
鬧鐘增刪改查
sqlite是一個(gè)安卓自帶的輕量級(jí)數(shù)據(jù)庫(kù)。增刪改查都是對(duì)數(shù)據(jù)庫(kù)的操作行為,另外使用sqlite去存儲(chǔ)時(shí)鐘的數(shù)據(jù),就可以防止數(shù)據(jù)的丟失,因此可以在時(shí)鐘的基礎(chǔ)上做一個(gè)計(jì)劃提醒之類(lèi)的,可以把計(jì)劃里的內(nèi)容存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)里,還有時(shí)間??梢栽诮?shù)據(jù)表的時(shí)候自帶一個(gè)自增的id,方便操作。數(shù)據(jù)庫(kù)的建表這些可以去搜索編寫(xiě),很簡(jiǎn)單,因此不多贅述。
/** ?* 轉(zhuǎn)儲(chǔ)數(shù)據(jù),寫(xiě)數(shù)據(jù)到數(shù)據(jù)庫(kù)中,增加數(shù)據(jù) ?* @param sqLiteDatabase 數(shù)據(jù)庫(kù) ?* @param context 內(nèi)容 ?* @param repeat 重復(fù) ?* @param date 時(shí)間 ?* @param count 時(shí)長(zhǎng) ?*/ 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(); ? ? } } /** ?* 修改數(shù)據(jù),寫(xiě)數(shù)據(jù)到數(shù)據(jù)庫(kù)中,增加數(shù)據(jù) ?* @param sqLiteDatabase 數(shù)據(jù)庫(kù) ?* @param context 內(nèi)容 ?* @param repeat 重復(fù) ?* @param date 時(shí)間 ?* @param count 時(shí)長(zhǎng) ?*/ 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(); ? ? } } /** ?* 刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù) ?* @param sqLiteDatabase 數(shù)據(jù)庫(kù) ?* @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(); ? ? } }
鬧鐘開(kāi)啟
在上面的布局里,可以看到有個(gè)按鍵,點(diǎn)擊它即可開(kāi)啟鬧鐘提醒,關(guān)閉它即可關(guān)閉鬧鐘提醒。開(kāi)啟鬧鐘的提示函數(shù)如下,將獲取的時(shí)間去與系統(tǒng)當(dāng)前時(shí)間比較,AlarmManager設(shè)置提醒。關(guān)閉鬧鐘就是一個(gè)簡(jiǎn)單的AlarmManager取消行為。那個(gè)提醒類(lèi)就是平時(shí)見(jiàn)到的那種簡(jiǎn)單的dialog提醒,所以不再次贅述。
/** ?* 開(kāi)啟鬧鐘 ?* @param parent 父類(lèi) ?* @param hour 小時(shí) ?* @param minute 分鐘 ?* @param position 位置 ?*/ private void startAlarm(ViewGroup parent, int hour, int minute, int position) { ? ? try { ? ? ? ? Calendar c = Calendar.getInstance(); ? ? ? ? c.setTimeInMillis(System.currentTimeMillis());//獲取當(dāng)前時(shí)間 ? ? ? ? //獲取當(dāng)前毫秒值 ? ? ? ? long systemTime = System.currentTimeMillis(); ? ? ? ? c.setTimeZone(TimeZone.getTimeZone("GMT+8"));//設(shè)置時(shí)區(qū) ? ? ? ? c.set(Calendar.HOUR_OF_DAY, hour);//設(shè)置幾點(diǎn)提醒 ? ? ? ? c.set(Calendar.MINUTE, minute);//設(shè)置幾分提醒 ? ? ? ? //獲取上面設(shè)置的時(shí)間 ? ? ? ? long selectTime = c.getTimeInMillis(); ? ? ? ? // 如果當(dāng)前時(shí)間大于設(shè)置的時(shí)間,那么就從第二天的設(shè)定時(shí)間開(kāi)始 ? ? ? ? if (systemTime > selectTime) { ? ? ? ? ? ? c.add(Calendar.DAY_OF_MONTH, 1); ? ? ? ? } ? ? ? ? /* 鬧鐘時(shí)間到了的一個(gè)提醒類(lèi) */ ? ? ? ? Intent intent = new Intent(parent.getContext(), ListenerActivity.class); ? ? ? ? @SuppressLint("UnspecifiedImmutableFlag") ? ? ? ? PendingIntent pi = PendingIntent.getActivity(parent.getContext(), 0, intent, 0); ? ? ? ? //得到AlarmManager實(shí)例 ? ? ? ? AlarmManager am = (AlarmManager)parent.getContext().getSystemService(ALARM_SERVICE); ? ? ? ? //重復(fù)提醒 ? ? ? ? am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 60*60*1000*24, pi); ? ? } catch (Exception e) { ? ? ? ? e.printStackTrace(); ? ? } } ? ?/** ?* 關(guān)閉提醒 ?* @param parent 父類(lèi) ?*/ 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(), "關(guān)閉了提醒", 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(); ? ? } }
總結(jié)
這是本人最近寫(xiě)的一個(gè)自定義鬧鐘提醒,代碼并不是全部代碼,但是主要的函數(shù)以及內(nèi)容都以及在上面闡述了。小小的嘗試了一下,代碼寫(xiě)的也不是特別的好,但是功能效果也是實(shí)現(xiàn)了的,在這里記錄一下思路還有代碼,做一個(gè)學(xué)習(xí)筆記。希望各位大佬們多指教,也希望能給大家?guī)?lái)一些靈感。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開(kāi)發(fā)之獲取單選與復(fù)選框的值操作示例
這篇文章主要介紹了Android開(kāi)發(fā)之獲取單選與復(fù)選框的值操作,結(jié)合實(shí)例形式分析了Android針對(duì)單選按鈕、復(fù)選框的事件響應(yīng)、數(shù)值獲取等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04Android入門(mén):廣播發(fā)送者與廣播接收者詳細(xì)介紹
本篇文章主要介紹了Android入門(mén):廣播發(fā)送者與廣播接收者,詳細(xì)介紹了廣播收發(fā)的原理和代碼,有需要的可以了解一下。2016-11-11從零開(kāi)始使用gradle配置即可執(zhí)行的Hook庫(kù)詳解
這篇文章主要為大家介紹了從零開(kāi)始使用gradle配置即可執(zhí)行的Hook庫(kù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android實(shí)現(xiàn)自定義標(biāo)題欄的方法
這篇文章主要介紹了Android實(shí)現(xiàn)自定義標(biāo)題欄的方法,需要的朋友可以參考下2015-12-12Flutter實(shí)現(xiàn)Android滾動(dòng)懸浮效果過(guò)程
這篇文章主要介紹了Flutter實(shí)現(xiàn)Android滾動(dòng)懸浮效果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01