Android鬧鈴服務(wù)AlarmManager用法深入分析
本文實(shí)例講述了Android鬧鈴服務(wù)AlarmManager用法。分享給大家供大家參考,具體如下:
對(duì)應(yīng)AlarmManage有一個(gè)AlarmManagerServie服務(wù)程 序,該服務(wù)程序才是正真提供鬧鈴服務(wù)的,它主要維護(hù)應(yīng)用程序注冊(cè)下來(lái)的各類鬧鈴并適時(shí)的設(shè)置即將觸發(fā)的鬧鈴給鬧鈴設(shè)備(在系統(tǒng)中,linux實(shí)現(xiàn)的設(shè)備名 為"/dev/alarm"),并且一直監(jiān)聽(tīng)鬧鈴設(shè)備,一旦有鬧鈴觸發(fā)或者是鬧鈴事件發(fā)生,AlarmManagerServie服務(wù)程序就會(huì)遍歷鬧鈴列 表找到相應(yīng)的注冊(cè)鬧鈴并發(fā)出廣播。該服務(wù)程序在系統(tǒng)啟動(dòng)時(shí)被系統(tǒng)服務(wù)程序system_service啟動(dòng)并初始化鬧鈴設(shè)備(/dev/alarm)。當(dāng) 然,在JAVA層的AlarmManagerService與Linux Alarm驅(qū)動(dòng)程序接口之間還有一層封裝,那就是JNI。
AlarmManager將應(yīng)用與服務(wù)分割開(kāi)來(lái)后,使得應(yīng)用程序開(kāi)發(fā)者不用 關(guān)心具體的服務(wù),而是直接通過(guò)AlarmManager來(lái)使用這種服務(wù)。這也許就是客戶/服務(wù)模式的好處吧。AlarmManager與 AlarmManagerServie之間是通過(guò)Binder來(lái)通信的,他們之間是多對(duì)一的關(guān)系。
在android系統(tǒng)中,AlarmManage提供了3個(gè)接口5種類型的鬧鈴服務(wù)。
3個(gè)接口:
// 取消已經(jīng)注冊(cè)的與參數(shù)匹配的鬧鈴 void cancel(PendingIntent operation) //注冊(cè)一個(gè)新的鬧鈴 void set( int type, long triggerAtTime, PendingIntent operation) //注冊(cè)一個(gè)重復(fù)類型的鬧鈴 void setRepeating( int type, long triggerAtTime, long interval, PendingIntent operation) //設(shè)置時(shí)區(qū) void setTimeZone(String timeZone)
Java代碼:
// 取消已經(jīng)注冊(cè)的與參數(shù)匹配的鬧鈴 void cancel(PendingIntent operation) //注冊(cè)一個(gè)新的鬧鈴 void set(int type, long triggerAtTime, PendingIntent operation) //注冊(cè)一個(gè)重復(fù)類型的鬧鈴 void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) //設(shè)置時(shí)區(qū) void setTimeZone(String timeZone)
5個(gè)鬧鈴類型
public static final int ELAPSED_REALTIME // 當(dāng)系統(tǒng)進(jìn)入睡眠狀態(tài)時(shí),這種類型的鬧鈴不會(huì)喚醒系統(tǒng)。直到系統(tǒng)下次被喚醒才傳遞它,該鬧鈴所用的時(shí)間是相對(duì)時(shí)間,是從系統(tǒng)啟動(dòng)后開(kāi)始計(jì)時(shí)的,包括睡眠時(shí) 間,可以通過(guò)調(diào)用SystemClock.elapsedRealtime()獲得。系統(tǒng)值是3 (0x00000003)。 public static final int ELAPSED_REALTIME_WAKEUP //能喚醒系統(tǒng),用法同ELAPSED_REALTIME,系統(tǒng)值是2 (0x00000002) 。 public static final int RTC //當(dāng)系統(tǒng)進(jìn)入睡眠狀態(tài)時(shí),這種類型的鬧鈴不會(huì)喚醒系統(tǒng)。直到系統(tǒng)下次被喚醒才傳遞它,該鬧鈴所用的時(shí)間是絕對(duì)時(shí)間,所用時(shí)間是UTC時(shí)間,可以通過(guò)調(diào)用 System.currentTimeMillis()獲得。系統(tǒng)值是1 (0x00000001) 。 public static final int RTC_WAKEUP //能喚醒系統(tǒng),用法同RTC類型,系統(tǒng)值為 0 (0x00000000) 。 Public static final int POWER_OFF_WAKEUP //能喚醒系統(tǒng),它是一種關(guān)機(jī)鬧鈴,就是說(shuō)設(shè)備在關(guān)機(jī)狀態(tài)下也可以喚醒系統(tǒng),所以我們把它稱之為關(guān)機(jī)鬧鈴。使用方法同RTC類型,系統(tǒng)值為4(0x00000004)。
Java代碼 :
public static final int ELAPSED_REALTIME //當(dāng)系統(tǒng)進(jìn)入睡眠狀態(tài)時(shí),這種類型的鬧鈴不會(huì)喚醒系統(tǒng)。直到系統(tǒng)下次被喚醒才傳遞它,該鬧鈴所用的時(shí)間是相對(duì)時(shí)間,是從系統(tǒng)啟動(dòng)后開(kāi)始計(jì)時(shí)的,包括睡眠 時(shí)間,可以通過(guò)調(diào)用SystemClock.elapsedRealtime()獲得。系統(tǒng)值是3 (0x00000003)。 public static final int ELAPSED_REALTIME_WAKEUP //能喚醒系統(tǒng),用法同ELAPSED_REALTIME,系統(tǒng)值是2 (0x00000002) 。 public static final int RTC //當(dāng)系統(tǒng)進(jìn)入睡眠狀態(tài)時(shí),這種類型的鬧鈴不會(huì)喚醒系統(tǒng)。直到系統(tǒng)下次被喚醒才傳遞它,該鬧鈴所用的時(shí)間是絕對(duì)時(shí)間,所用時(shí)間是UTC時(shí)間,可以通過(guò)調(diào)用 System.currentTimeMillis()獲得。系統(tǒng)值是1 (0x00000001) 。 public static final int RTC_WAKEUP //能喚醒系統(tǒng),用法同RTC類型,系統(tǒng)值為 0 (0x00000000) 。 Public static final int POWER_OFF_WAKEUP //能喚醒系統(tǒng),它是一種關(guān)機(jī)鬧鈴,就是說(shuō)設(shè)備在關(guān)機(jī)狀態(tài)下也可以喚醒系統(tǒng),所以我們把它稱之為關(guān)機(jī)鬧鈴。使用方法同RTC類型,系統(tǒng)值為 4(0x00000004)。
注意一個(gè)重要的參數(shù)PendingIntent。這個(gè)PendingIntent可以說(shuō)是 Intent的進(jìn)一步封裝,他既包含了Intent的描述又是Intent行為的執(zhí)行(這種定義也許不太嚴(yán)格),如果將Intent比作成一個(gè)訂單的 話,PendingIntent更像是一個(gè)下訂單的人,因?yàn)樗纫?fù)責(zé)將訂單發(fā)出去,也要負(fù)責(zé)訂單發(fā)送后的處理,比如發(fā)送成功后要準(zhǔn)備驗(yàn)收訂單貨物,發(fā)送 失敗后要重發(fā)還是取消訂單等操作。開(kāi)發(fā)者可以通過(guò)調(diào)用
getActivity(Context, int, Intent, int)
getBroadcast(Context, int, Intent, int)
getService(Context, int, Intent, int)
三種不同方式來(lái)得到一個(gè)PendingIntent實(shí)例。
getBroadcast——通過(guò)該函數(shù)獲得的PendingIntent將會(huì) 扮演一個(gè)廣播的功能,就像調(diào)用 Context.sendBroadcast()函數(shù)一樣。當(dāng)系統(tǒng)通過(guò)它要發(fā)送一個(gè)intent時(shí)要采用廣播的形式,并且在該intent中會(huì)包含相應(yīng)的 intent接收對(duì)象,當(dāng)然這個(gè)對(duì)象我們可以在創(chuàng)建PendingIntent的時(shí)候指定,也可以通過(guò)ACTION 和CATEGORY等描述讓系統(tǒng)自動(dòng)找到該行為處理對(duì)象。
Intent intent = new Intent(AlarmController. this , OneShotAlarm. class ); PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this , 0 , intent, 0 );
Java代碼:
Intent intent = new Intent(AlarmController.this, OneShotAlarm.class); PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this, 0, intent, 0);
getActivity——通過(guò)該函數(shù)獲得的PendingIntent可以直 接啟動(dòng)新的activity, 就像調(diào)用 Context.startActivity(Intent)一樣.不過(guò)值得注意的是要想這個(gè)新的Activity不再是當(dāng)前進(jìn)程存在的Activity 時(shí)。我們?cè)趇ntent中必須使用Intent.FLAG_ACTIVITY_NEW_TASK.
// The PendingIntent to launch our activity if the user selects this notification PendingIntent contentIntent = PendingIntent.getActivity(this , 0 , new Intent( this , AlarmService. class ), 0 );
Java代碼:
// The PendingIntent to launch our activity if the user selects this notification PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, AlarmService.class), 0);
getService——通過(guò)該函數(shù)獲得的PengdingIntent可以直接啟動(dòng)新的Service,就像調(diào)用Context.startService()一樣。
// Create an IntentSender that will launch our service, to be scheduled // with the alarm manager. mAlarmSender = PendingIntent.getService(AlarmService.this , 0 , new Intent(AlarmService. this , AlarmService_Service. class ), 0 );
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- android開(kāi)發(fā)之蜂鳴提示音和震動(dòng)提示的實(shí)現(xiàn)原理與參考代碼
- Android實(shí)現(xiàn)調(diào)用震動(dòng)的方法
- android滑動(dòng)解鎖震動(dòng)效果的開(kāi)啟和取消
- android獲取情景模式和鈴聲 實(shí)現(xiàn)震動(dòng)、鈴聲提醒
- android 觸屏的震動(dòng)響應(yīng)接口調(diào)用方法
- Android實(shí)現(xiàn)手機(jī)震動(dòng)效果
- Android震動(dòng)與提示音實(shí)現(xiàn)代碼
- android鬧鈴簡(jiǎn)單實(shí)現(xiàn)
- Android設(shè)置鈴聲實(shí)現(xiàn)代碼
- Android編程實(shí)現(xiàn)震動(dòng)與振鈴的方法詳解
相關(guān)文章
Android自定義view實(shí)現(xiàn)圓的擴(kuò)散效果
這篇文章主要為大家詳細(xì)介紹了Android自定義view實(shí)現(xiàn)圓的擴(kuò)散效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android AlertDialog六種創(chuàng)建方式案例詳解
這篇文章主要介紹了Android AlertDialog六種創(chuàng)建方式案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
android 解析json數(shù)據(jù)格式的方法
這篇文章主要介紹了android 解析json數(shù)據(jù)格式的方法,有需要的朋友可以參考一下2014-01-01
Android Shader應(yīng)用開(kāi)發(fā)之霓虹閃爍文字效果
這篇文章主要為大家詳細(xì)介紹了Android Shader應(yīng)用開(kāi)發(fā)之霓虹閃爍文字效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android 調(diào)用系統(tǒng)應(yīng)用的方法總結(jié)
這篇文章主要介紹了Android 調(diào)用系統(tǒng)應(yīng)用的方法總結(jié)的相關(guān)資料,這里提供調(diào)用錄像,錄音,拍照等功能,需要的朋友可以參考下2017-08-08
Android仿騰訊視頻實(shí)現(xiàn)懸浮窗效果
對(duì)view比較熟悉的同學(xué)們應(yīng)該發(fā)現(xiàn)了,其實(shí)我們的懸浮窗就是一個(gè)view,我們只需要把view添加到windowManager上就可以了。那么,下面通過(guò)本文給大家分享Android仿騰訊視頻實(shí)現(xiàn)懸浮窗效果,一起看看吧2021-06-06
Android實(shí)現(xiàn)可滑動(dòng)的自定義日歷控件
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可滑動(dòng)的自定義日歷控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android鬧鐘啟動(dòng)時(shí)間設(shè)置無(wú)效問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了Android鬧鐘啟動(dòng)時(shí)間設(shè)置無(wú)效問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Android開(kāi)發(fā)使用json實(shí)現(xiàn)服務(wù)器與客戶端數(shù)據(jù)的交互功能示例
這篇文章主要介紹了Android開(kāi)發(fā)使用json實(shí)現(xiàn)服務(wù)器與客戶端數(shù)據(jù)的交互功能,結(jié)合具體實(shí)例形式分析了Android使用json格式數(shù)據(jù)在服務(wù)器與客戶端傳遞實(shí)現(xiàn)數(shù)據(jù)庫(kù)查詢功能的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10

