小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Android之AlarmManager(全局定時器/鬧鐘)指定時長或以周期形式執(zhí)行某項操作

 點點滴滴 2017-06-08

 

1、AlarmManager,顧名思義,就是“提醒”,是Android中常用的一種系統(tǒng)級別的提示服務(wù),可以實現(xiàn)從指定時間開始,以一個固定的間隔時間執(zhí)行某項操作,所以常常與廣播(Broadcast)連用,實現(xiàn)鬧鐘等提示功能

 

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

 

(1)set(int type,long startTime,PendingIntent pi);

 

該方法用于設(shè)置一次性鬧鐘,第一個參數(shù)表示鬧鐘類型,第二個參數(shù)表示鬧鐘執(zhí)行時間,第三個參數(shù)表示鬧鐘響應(yīng)動作。

 

(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

 

該方法用于設(shè)置重復(fù)鬧鐘,第一個參數(shù)表示鬧鐘類型,第二個參數(shù)表示鬧鐘首次執(zhí)行時間,第三個參數(shù)表示鬧鐘兩次執(zhí)行的間隔時間,第三個參數(shù)表示鬧鐘響應(yīng)動作。

 

(3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

 

該方法也用于設(shè)置重復(fù)鬧鐘,與第二個方法相似,不過其兩個鬧鐘執(zhí)行的間隔時間不是固定的而已。

 

3、三個方法各個參數(shù)詳悉:

 

(1)int type:鬧鐘的類型,常用的有5個值:AlarmManager.ELAPSED_REALTIME、AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、AlarmManager.RTC_WAKEUP、AlarmManager.POWER_OFF_WAKEUP。

 

AlarmManager.ELAPSED_REALTIME表示鬧鐘在手機睡眠狀態(tài)下不可用,該狀態(tài)下鬧鐘使用相對時間(相對于系統(tǒng)啟動開始),狀態(tài)值為3;

 

AlarmManager.ELAPSED_REALTIME_WAKEUP表示鬧鐘在睡眠狀態(tài)下會喚醒系統(tǒng)并執(zhí)行提示功能,該狀態(tài)下鬧鐘也使用相對時間,狀態(tài)值為2;

 

AlarmManager.RTC表示鬧鐘在睡眠狀態(tài)下不可用,該狀態(tài)下鬧鐘使用絕對時間,即當前系統(tǒng)時間,狀態(tài)值為1;

 

AlarmManager.RTC_WAKEUP表示鬧鐘在睡眠狀態(tài)下會喚醒系統(tǒng)并執(zhí)行提示功能,該狀態(tài)下鬧鐘使用絕對時間,狀態(tài)值為0;

 

AlarmManager.POWER_OFF_WAKEUP表示鬧鐘在手機關(guān)機狀態(tài)下也能正常進行提示功能,所以是5個狀態(tài)中用的最多的狀態(tài)之一,該狀態(tài)下鬧鐘也是用絕對時間,狀態(tài)值為4;不過本狀態(tài)好像受SDK版本影響,某些版本并不支持;

 

(2)long startTime:鬧鐘的第一次執(zhí)行時間,以毫秒為單位,可以自定義時間,不過一般使用當前時間。需要注意的是,本屬性與第一個屬性(type)密切相關(guān),如果第一個參數(shù)對應(yīng)的鬧鐘使用的是相對時間(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本屬性就得使用相對時間(相對于系統(tǒng)啟動時間來說),比如當前時間就表示為:SystemClock.elapsedRealtime();如果第一個參數(shù)對應(yīng)的鬧鐘使用的是絕對時間(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本屬性就得使用絕對時間,比如當前時間就表示為:System.currentTimeMillis()。

 

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

 

(4)PendingIntent pi:是鬧鐘的執(zhí)行動作,比如發(fā)送一個廣播、給出提示等等。PendingIntent是Intent的封裝類。需要注意的是,如果是通過啟動服務(wù)來實現(xiàn)鬧鐘提示的話,PendingIntent對象的獲取就應(yīng)該采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通過廣播來實現(xiàn)鬧鐘提示的話,PendingIntent對象的獲取就應(yīng)該采用PendingIntent.getBroadcast(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式來實現(xiàn)鬧鐘提示的話,PendingIntent對象的獲取就應(yīng)該采用PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。

 

AlarmManager的使用機制有的稱呼為全局定時器,有的稱呼為鬧鐘。通過對它的使用,個人覺得叫全局定時器比較合適,其實它的作用和Timer有點相似。都有兩種相似的用法:(1)在指定時長后執(zhí)行某項操作(2)周期性的執(zhí)行某項操作

AlarmManager對象配合Intent使用,可以定時的開啟一個Activity,發(fā)送一個BroadCast,或者開啟一個Service.

下面的代碼詳細的介紹了兩種定時方式的使用:

(1)在指定時長后執(zhí)行某項操作

復(fù)制代碼
//操作:發(fā)送一個廣播,廣播接收后Toast提示定時操作完成
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("short");
PendingIntent sender=
PendingIntent.getBroadcast(Main.this, 0, intent, 0);

//設(shè)定一個五秒后的時間
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 5);

AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
//或者以下面方式簡化
//alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);
復(fù)制代碼
復(fù)制代碼
//注意:receiver記得在manifest.xml注冊
public static class alarmreceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals("short")){
      Toast.makeText(context, "short alarm", Toast.LENGTH_LONG).show();
}else{
       Toast.makeText(context, "repeating alarm",Toast.LENGTH_LONG).show();
    }
  }
}
復(fù)制代碼

AlarmManager類型如下:

AlarmManager.RTC,硬件鬧鐘,不喚醒手機(也可能是其它設(shè)備)休眠;當手機休眠時不發(fā)射鬧鐘。

AlarmManager.RTC_WAKEUP,硬件鬧鐘,當鬧鐘發(fā)射時喚醒手機休眠;

AlarmManager.ELAPSED_REALTIME,真實時間流逝鬧鐘,不喚醒手機休眠;當手機休眠時不發(fā)射鬧鐘。

AlarmManager.ELAPSED_REALTIME_WAKEUP,真實時間流逝鬧鐘,當鬧鐘發(fā)射時喚醒手機休眠;

 

RTC鬧鐘和ELAPSED_REALTIME最大的差別就是前者可以通過修改手機時間觸發(fā)鬧鐘事件,后者要通過真實時間的流逝,即使在休眠狀態(tài),時間也會被計算。

 

 

(2)周期性的執(zhí)行某項操作

       

復(fù)制代碼
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("repeating");
PendingIntent sender=PendingIntent
.getBroadcast(Main.this, 0, intent, 0);
//開始時間
long firstime=SystemClock.elapsedRealtime();

AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
 //5秒一個周期,不停的發(fā)送廣播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 5*1000, sender);
復(fù)制代碼

 

AlarmManager的setRepeating()相當于Timer的Schedule(task,delay,peroid);有點差異的地方時Timer這個方法是指定延遲多長時間以后開始周期性的執(zhí)行task;

AlarmManager的取消:(其中需要注意的是取消的Intent必須與啟動Intent保持絕對一致才能支持取消AlarmManager)

 

  

Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("repeating");
PendingIntent sender=PendingIntent
.getBroadcast(Main.this, 0, intent, 0);
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.cancel(sender);

 補充:這個廣播的最小間隔為60000(1分鐘)!這應(yīng)該是為了避免頻繁廣播小號大量資源。

不要讓昨天的沮喪 讓今天的夢想黯然失色 成功的人總是修改方法而不修改目標 微信公眾號:javenlife

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多