android 系統原生鬧鐘原始碼解析(附原始碼)

2021-06-29 08:09:31 字數 3476 閱讀 9592

最近看了一下android 4.4系統原生鬧鐘的**,做個總結。並將原始碼提取出,做了些精簡,重新組織打包,這樣可直接執行安裝,也不與手機自帶衝突,方便學習。原生鬧鐘,十分穩定,可能的衝突事件都考慮並處理,只要美化介面,就是個不錯的鬧鐘apk.  

進入正題,如何寫乙個鬧鐘應用,需要考慮哪些。我從以下幾點做個簡單介紹。

1.鬧鐘實現原理,如何實現動作定時觸發?

2.鬧鐘alarm如何設定,包含哪些元素?

3.如何管理鬧鐘設定-alarm?

4.如何管理乙個鬧鐘事件-alarminstance?

5.舉例分析,如何實現乙個鬧鐘在每週一,週三,早上8點響起?

6.開關機,時區時間改變,來電等衝突事件都做哪些處理?

針對以上問題,詳細介紹如下。只介紹大致流程,處理細節請閱讀**,注釋已十分詳盡。

1.鬧鐘實現原理,如何實現動作定時觸發?

intent statechangeintent = createstatechangeintent(context,

alarm_manager_tag, instance, newstate);

pendingintent pendingintent = pendingintent.getbroadcast(context,

instance.hashcode(), statechangeintent,

pendingintent.flag_update_current);

alarmmanager am = (alarmmanager) context

.getsystemservice(context.alarm_service);

if (utils.iskitkatorlater()) else

通過上述方法,可在指定時間使pendingintnet傳送廣播,然後程式實現brodcastreceiver,接收此廣播;

這樣就可在指定時間,作出動作;

一條鬧鐘設定alarm包含:時間設定(幾點幾分),標籤(名字),重複(是否單次使用),重複日期,是否振動,鈴聲設定;

其中重複日期設定--daysofweek,  原始碼中的設計如下,通過乙個整數表示所有情況:

1111111:通過移位與或運算來確定某天是否被選中;

days of week code as a single int.

0x00(0000000): no day

0x01(0000001): monday

0x02(0000010) :tuesday

0x04(0000100): wednesday

0x08(0001000): thursday

0x10(0010000): friday

0x20(0100000): saturday

0x40(1000000): sunday

0x7f(1111111) :everyday

這樣假如星期一,星期三被選中,就是0000101;

周一週三八點鬧鐘設定為:hour=8,minute=0, daysofweek=5,enabled=true; 

3.如何管理鬧鐘設定-alarm?

當然資料庫,原生又實現了contentprovider,通過uri進行新增,刪除,更新。體現了android的統一性;

這個自己看**;

4.如何管理乙個鬧鐘事件-alarminstance?

每乙個生效的鬧鐘設定-alarm,會生成乙個鬧鐘事件-alarminstance;  乙個鬧鐘事件對應乙個生效鬧鐘(alarm.enabled=true);

乙個鬧鐘事件包括:

1.  alarmtime(鬧鐘觸發時間,根據alarm設定結合當前時間計算而來)

2. state( 鬧鐘事件狀態),原始碼中乙個鬧鐘事件分為7個狀態;

狀態流程:

舉例:設定鬧鐘時間為8點整,則產生乙個鬧鐘事件-alarminstance 的alarmtime為8點;

(1)silent_state:(6:00點以前,沒有任何提示); 

(2)low_notification_state(6:00-7:30,通知欄有提示預定鬧鐘,通知可去除)

(3)high_notification_state(7:30-7:59,通知欄有提示預定鬧鐘,通知不可去除)

(4)fired_state(8:00,鬧鐘觸發)

(未做任何操作,直到響聲結束)

(5)snooze_state(8:00--設定的暫停時間,鬧鐘暫停)

(6)missed_state(鬧鐘響起無任何操作,設定的鬧鐘響起時間過後,通知欄提示錯過鬧鐘);

(7)dismissed_state(鬧鐘關閉)

如何管理鬧鐘事件alarminstance狀態:

結合上邊第一條定時觸發原理,寫乙個broadcastreceiver類----alarmstatemanager,負責接收廣播,並改變鬧鐘事件的狀態;

比如現在是7:50,設定的鬧鐘是8點;於是產生一條鬧鐘事件alarminstance,根據規則判斷當前狀態為 high_notification_state,然後呼叫am.set(alarmmanager.rtc_wakeup, timeinmillis, pendingintent);使其在8:00傳送廣播,intent包含要alarminstance設定的狀態(fired_state),同時再次呼叫上述方法(alarmmanager.set)傳送廣播包含要alarminstance設定的(missed_state);

若鬧鐘響起時使用者選擇稍後響起,此時關閉當前鬧鐘,並將鬧鐘事件alarminstance的狀態設定為snooze_state,呼叫(alarmmanager.set),設定下次狀態為fired_state;

若鬧鐘響起時使用者選擇關閉,則關閉當前鬧鐘,刪除此鬧鐘事件alarminstance;  同時通過此鬧鐘事件對應的鬧鐘設定alarm,根據其重複日期,計算下次鬧鐘事件時間,並生成新的alarminstance,設定其初始狀態,並呼叫(alarmmanager.set),使其在指定時間收到廣播並修改對應狀態;

若鬧鐘響起,使用者不做任何操作,則到時會接收到之間預傳送的廣播,並將鬧鐘事件狀態設定為missed_state;

其中datetimepicker為library,在eclipse中配置後就可直接執行;

Android安卓人臉識別考勤APP原始碼與介紹

國內外人臉識別技術已經成熟,我們 將簽到 考勤或者門禁 與人臉識別有效地結合成一種新型的簽到方式,即人臉識別簽到系統,這將極大地加快簽到速度並且減少人力成本,縮短簽到時間。讓簽到更加的方便快捷和安全有效。本人通過從概述到原理再到原始碼講述,請耐心看完哦。對於人臉識別技術,目前演算法分為2種,這種方式...

最快速的「高斯」模糊演算法(附Android原始碼)

這是乙個外國人的演算法,本人是搬運工。參考 1 高斯模糊演算法 參考 所謂的模糊演算法就是當前畫素點和周圍畫素點進行加權均值之後的結果替換當前畫素值。因此均值模糊是最簡單的,只要將周圍的畫素點相加取平均值即可。而高斯模糊則是將周圍的畫素點的權值按照高斯分布進行取值,即根據距離當前畫素點的距離確定取值...

android原生App系統 列印實現解決方案

一 解決方案核心思路 二 解決方案核心優勢與不足 方式1通過酷酷辮資料線與列印直接聯接,實現列印,優點 穩定 配件酷酷辮 約20元 方式2手機與印表機同處於相同wifi環境中,優點 簡便,明顯缺點 需要事先在windows環境中將印表機加入到該wifi中才可以。不足 僅適用android手機 平板 ...