android 定時器的使用

2021-07-04 05:39:52 字數 4314 閱讀 5038

1、android中通常是使用alarmmanager來定時啟動乙個單次或重複多次操作的。具體的說就是我們通過alarmmanager設定乙個時間和註冊乙個intent到系統中,然後在該時間到來時,系統為我們傳送乙個廣播,即執行我們設定的intent(要執行的操作),通常我們使用 pendingintent來實現%26ldquo;要執行的操作%26rdquo;,pendingintent可以理解為intent的封裝包,簡單的說就是將來要執行的intent操作。他們的區別是:在使用intent的時候,我們還需要在執行startactivity、startservice或sendbroadcast才能使intent有用,而pendingintent的話就是將這個動作包含在內,可以直接執行。

定義乙個pendingintent物件。

// 啟動service

intent intent = new intent(instance, recommendservice.class);//新建乙個可以執行當前context操作的intent

intent.putextra("userinfobody", userinfobody);

intent.putextra("isdynamic", true);

intent.putextra("content", comment);

if (!textutils.isempty(sayhiorcollect))

pendingintent sender = pendingintent.getservice(instance, 1, intent, pendingintent.flag_update_current);//第乙個引數是context,第二個引數是區分不同intent的區別碼,第三個引數是intent,第四個是傳送了兩個相同的

//pendingintent時如何處理資料和intent,具體見下面的引數介紹

long firsttime = systemclock.elapsedrealtime();

firsttime += 1 * 1000;

// schedule the alarm! 16 * 60 * 1000

alarmmanager am = (alarmmanager) getsystemservice(alarm_service);

am.setrepeating(alarmmanager.elapsed_realtime_wakeup, firsttime, 10 * 60 * 1000, sender);//alarmmanager引數含義見下面的說明

%26nbsp;

注意:兩個pendingintent相同是指它們的operation一樣, 且其它們的intent的action, data, categories,%26nbsp;components和flags都一樣。但是它們的intent的extra可以不一樣。因此會出現intent攜帶的內容無法更新的問題,解決途徑是設定%26nbsp;pendingintent.flag_update_current

%26nbsp;

**中getservice()方法最後乙個引數的主要常量有:

%26nbsp;

flag_cancel_current:如果當前系統中已經存在乙個相同的pendingintent物件,那麼就將先將已有的pendingintent取消,然後重新生成乙個pendingintent物件。

flag_no_create:如果當前系統中不存在相同的pendingintent物件,系統將不會建立該pendingintent物件而是直接返回null。

flag_one_shot:該pendingintent只作用一次。在該pendingintent物件通過send()方法觸發過後,pendingintent將自動呼叫cancel()進行銷毀,那麼如果你再呼叫send()方法的話,系統將會返回乙個sendintentexception。

flag_update_current:如果系統中有乙個和你描述的pendingintent對等的pendinginent,那麼系統將使用該pendingintent物件,但是會使用新的intent來更新之前pendingintent中的intent物件資料,例如更新intent中的extras。

%26nbsp;

2、alarmmanager的常用方法有三個:

(1)set(int type,long starttime,pendingintent pi);

該方法用於設定一次性鬧鐘,第乙個引數表示鬧鐘型別,第二個引數表示鬧鐘執行時間,第三個引數表示鬧鐘響應動作。

(2)setrepeating(int type,long starttime,long intervaltime,pendingintent pi);

該方法用於設定重複鬧鐘,第乙個引數表示鬧鐘型別,第二個引數表示鬧鐘首次執行時間,第三個引數表示鬧鐘兩次執行的間隔時間,第三個引數表示鬧鐘響應動作。

(3)setinexactrepeating(int type,long starttime,long intervaltime,pendingintent pi);

該方法也用於設定重複鬧鐘,與第二個方法相似,不過其兩個鬧鐘執行的間隔時間不是固定的而已。

3、三個方法各個引數詳悉:

(1)int type: 鬧鐘的型別,常用的有5個值:alarmmanager.elapsed_realtime、 alarmmanager.elapsed_realtime_wakeup、alarmmanager.rtc、 alarmmanager.rtc_wakeup、alarmmanager.power_off_wakeup。

alarmmanager.elapsed_realtime表示鬧鐘在手機睡眠狀態下不可用,該狀態下鬧鐘使用相對時間(相對於系統啟動開始),狀態值為3;

alarmmanager.elapsed_realtime_wakeup表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘也使用相對時間,狀態值為2;

alarmmanager.rtc表示鬧鐘在睡眠狀態下不可用,該狀態下鬧鐘使用絕對時間,即當前系統時間,狀態值為1;

alarmmanager.rtc_wakeup表示鬧鐘在睡眠狀態下會喚醒系統並執行提示功能,該狀態下鬧鐘使用絕對時間,狀態值為0;

alarmmanager.power_off_wakeup表示鬧鐘在手機關機狀態下也能正常進行提示功能,所以是5個狀態中用的最多的狀態之一,該狀態下鬧鐘也是用絕對時間,狀態值為4;不過本狀態好像受sdk版本影響,某些版本並不支援;

(2)long starttime: 鬧鐘的第一次執行時間,以毫秒為單位,可以自定義時間,不過一般使用當前時間。需要注意的是,本屬性與第乙個屬性(type)密切相關,如果第乙個引數對 應的鬧鐘使用的是相對時間(elapsed_realtime和elapsed_realtime_wakeup),那麼本屬性就得使用相對時間(相對於 系統啟動時間來說),比如當前時間就表示為:systemclock.elapsedrealtime();如果第乙個引數對應的鬧鐘使用的是絕對時間 (rtc、rtc_wakeup、power_off_wakeup),那麼本屬性就得使用絕對時間,比如當前時間就表示 為:system.currenttimemillis()。

(3)long intervaltime:對於後兩個方法來說,存在本屬性,表示兩次鬧鐘執行的間隔時間,也是以毫秒為單位。

(4)pendingintent pi: 繫結了鬧鐘的執行動作,比如傳送乙個廣播、給出提示等等。pendingintent是intent的封裝類。需要注意的是,如果是通過啟動服務來實現鬧鐘提 示的話,pendingintent物件的獲取就應該採用pending.getservice(context c,int i,intent intent,int j)方法;如果是通過廣播來實現鬧鐘提示的話,pendingintent物件的獲取就應該採用 pendingintent.getbroadcast(context c,int i,intent intent,int j)方法;如果是採用activity的方式來實現鬧鐘提示的話,pendingintent物件的獲取就應該採用 pendingintent.getactivity(context c,int i,intent intent,int j)方法。如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。

4.上面**中

recommendservice.class

類的具體內容:

public class recommendservice extends intentservice  

}

該intentservice的優勢在於會按順序執行被定時器多次啟動的傳送過來的intent的操作,並且耗時的intent操作不用在新建子執行緒,因為intentsevice已經為每個intent建立workthread。

%26nbsp;

%26nbsp;

參考文獻:

%26nbsp;

android 定時器的使用

1 在網路開發,我們經常會遇到連線網路的情況,在獲取資料時我們一般會採用乙個進度條的方式來提醒使用者當前程式正在執行獲取資料,但是,在網路連線失敗的情況下,我們不能一直讓進度條在介面上顯示,應該在一定時間內提醒使用者檢查網路,此時就應該讓進度條不顯示,下面是乙個簡單的demo,僅供參考 privat...

android 定時器的使用

1 android中通常是使用alarmmanager來定時啟動乙個單次或重複多次操作的。具體的說就是我們通過alarmmanager設定乙個時間和註冊乙個intent到系統中,然後在該時間到來時,系統為我們傳送乙個廣播,即執行我們設定的intent 要執行的操作 通常我們使用 pendingint...

android 定時器的使用

1 android中通常是使用alarmmanager來定時啟動乙個單次或重複多次操作的。具體的說就是我們通過alarmmanager設定乙個時間和註冊乙個intent到系統中,然後在該時間到來時,系統為我們傳送乙個廣播,即執行我們設定的intent 要執行的操作 通常我們使用 pendingint...