原文地址:http://www.cnblogs.com/kross/p/3643708.html
AlarmManager可以設定一個規定的時間,或者重複從某一個時間開始,等間隔的做一個操作。可以用來做一個鬧鐘程式,或者在特定的時間訪問互連網。
擷取AlarmManager和擷取系統的其他服務是一樣的,使用如下代碼:
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
我們通過AlarmManager來發送一條請求到BroadcastReceiver,先簡單的實現一個BroadcastReceiver。
MyReceiver String TAG = "MyReceiver" "onReceive"
做完這步之後,記得要在Manifest檔案裡面註冊這個類,要不然是沒有任何反應的……
然後我們就在MainActivity裡面弄一個按鈕,按鈕的方法裡面就建立Intent,讓AlarmManager來發送請求。
"foo"= Intent(, MyReceiver."hahah"= PendingIntent.getBroadcast(, 1= time = am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 5000"foo over"
這裡很重要的一點就是這個elapsedRealtime這個東西,經過我的測試,終於發現這個時間是什麼東西了。
它是你開機之後到當前的時間,怎麼說呢,打個比方吧,假如你關掉手機,然後開機,開機完成後的第一件事就是調用這個SystemClock.elapsedRealtime()方法,你把它轉成字串,得到的時間是1970.01.01 08:00:00
然後你後續的調用都是基於這個時間之上的,比如開機後過了30s,你去調用這個方法,得到的時間就是1970.01.01 08:00:30
如果你又重新啟動了手機,時間又會被重設回1970.01.01 08:00:00。
我看很多部落格都沒有講清楚這一點,都是模糊的,照本宣科似得翻譯了下文檔,看得似懂非懂的。
AlarmManager的set方法就是發一次請求,setRepeating就是重複的發請求,這兩個方法的第一個參數都十分的詭異,我並沒有真正的搞明白。
其實可以分兩組,一組是RLAPSED_REALTIME, RLAPSED_REALTIME_WAKEUP,另一組是RTC, RTC_WAKEUP,這兩組的區別在於用的是哪一個時間,RLAPSED_REALTIME這一組用的是SystemClock.elapsedRealtime()取到的時間,讓RTC用的就是正常的時間,這兩者有什麼區別呢,後者RTC,使用者可以通過修改手機的時間(就是設定時間嘛,誰都可以做到)來改變,可能會重複調用到AlarmManager。而elapsed realtime是沒有辦法的。
然後就是這個WAKEUP的問題,文檔上說是什麼裝置睡眠的時候會被喚醒,但是我不知道所謂的裝置sleep是個什麼狀態……我做了一個5s發送一次請求的例子,啟動後,把螢幕給關掉了(就是黑了屏,再進去要點亮螢幕,然後解鎖),它還是會發送請求,並且也沒有所謂的喚醒,所以這個沒有搞明白……
原文地址:http://www.cnblogs.com/kross/p/3643708.html
新浪微博:http://weibo.com/KrossFord