1. 程式人生 > >Android之AlarmManager(全域性定時器/鬧鐘)指定時長或以週期形式執行某項操作

Android之AlarmManager(全域性定時器/鬧鐘)指定時長或以週期形式執行某項操作

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

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)方法。如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。

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

AlarmManager物件配合Intent使用,可以定時的開啟一個Activity,傳送一個BroadCast,或者開啟一個Service.

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

(1)在指定時長後執行某項操作

//操作:傳送一個廣播,廣播接收後Toast提示定時操作完成
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("short");
PendingIntent sender=
PendingIntent.getBroadcast(Main.this, 0, intent, 0);

//設定一個五秒後的時間
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);
//注意: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();
    }
  }
}

AlarmManager型別如下:

AlarmManager.RTC,硬體鬧鐘,不喚醒手機(也可能是其它裝置)休眠;當手機休眠時不發射鬧鐘。

AlarmManager.RTC_WAKEUP,硬體鬧鐘,當鬧鐘發射時喚醒手機休眠;

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

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

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

(2)週期性的執行某項操作

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秒一個週期,不停的傳送廣播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 5*1000, sender);

AlarmManager的setRepeating()相當於Timer的Schedule(task,delay,peroid);有點差異的地方時Timer這個方法是指定延遲多長時間以後開始週期性的執行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);

相關推薦

AndroidAlarmManager(全域性定時/鬧鐘指定週期形式執行操作

1、AlarmManager,顧名思義,就是“提醒”,是Android中常用的一種系統級別的提示服務,可以實現從指定時間開始,以一個固定的間隔時間執行某項操作,所以常常與廣播(Broadcast)連用,實現鬧鐘等提示功能 2、AlarmManager的常用方法有三個: (1)set(int t

androidhandler做定時,獲取經緯度資訊

package com.example.gpslocation; import android.app.Activity; import android.content.Context; import android.location.Criteria; import an

AlarmManager 鬧鐘全域性定時

Alarm(警告、警報  “可以讀成-(e老母)”),別問我為什麼這麼讀,英語差我任性! AlarmManager這個類提供對系統鬧鐘服務的訪問介面。你可以為你的應用設定一個未來某個時間喚醒的功能。

Linux時間子系統四:定時的引擎:clock_event_device

到來 開始 register 工作模式 統一 10個 net 說過 序列 早期的內核版本中,進程的調度基於一個稱之為tick的時鐘滴答,通常使用時鐘中斷來定時地產生tick信號,每次tick定時中斷都會進行進程的統計和調度,並對tick進行計數,記錄在一個jiffies變量

Linux時間子系統七:定時的應用--msleep(),hrtimer_nanosleep()

get 關系 警告 mov signed num wakeup sch switch 我們已經在前面幾章介紹了低分辨率定時器和高精度定時器的實現原理,內核為了方便其它子系統,在時間子系統中提供了一些用於延時或調度的API,例如msleep,hrtimer_nanosleep

stm32打怪升級瞥眼定時

idt blog app include 定時器 rip 搜索 lcm clas 定時器TIM------->DMA(不用看功能直接忽略介紹) 外部中斷得開啟復用功能 定時器TIM)時鐘源:stm32時鐘系統框圖(需要下載)外部中斷得開啟復用功能實驗目的:定時1s讓燈

Arduino 眨眼睛(定時版本

Arduino 眨眼睛(定時器版本) /* LED 指示燈,定時閃爍 */ // 定義 LED 燈狀態 int ledStatus = LOW; // 儲存最後一次LED燈亮的時間 long previousMillis = 0; // 定義LED燈閃爍的時間間隔 long i

Java幾種定時的使用

沒有去仔細研究這兩種定時器的API,會使用及能在專案中應用即可; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.S

Android訊息處理機制(二Handler的本質-Message和Looper到底是什麼?

目錄 Android之訊息處理機制(二) 以下皆為乾貨,比較幹,需要讀者細細理解。  前面(一)已經解釋了Handler的基本機制了,下面來概括一下本質。 一、MessageQueue        MessageQueue其實就

iOS -- GCD延遲與定時

我們開發常用的定時器有三種:NSTimer,CADisplyLink,CGD 本文詳細說一下CGD的延遲與定時器方法。文章最後,也會說說GCD與前兩個的區別。 直接上程式碼,首先是延遲的程式碼: 其中的delayInSeconds就是延遲的時間,執行之後,輸出臺會在2s之後,列

AndroidAlarmManager

AlarmManager 包含的主要方法:// 取消已經註冊的與引數匹配的定時器 void cancel(PendingIntent operation) //註冊一個新的延遲定時器 void set(int type, long triggerAtTime

AndroidActivity系列總結(一--Activity概述

本文內容建立 Activity實現使用者介面在清單檔案中宣告 Activity啟動 Activity啟動 Activity 以獲得結果結束 Activity管理 Activity 生命週期實現生命週期回撥儲存 Activity 狀態處理配置變更協調 Activity 是一個應用元件,使用者可與其提供的螢幕進行

STM32TIM1高階定時

定時器應用之PWM輸出 1.1 TIM1_CH1N 與 TIM1_CH1 的區別 在剛準備使用定時器的時候,我看了下原理圖,發現對於定時器1,它的每一個輸出通道都是成對的,即TIM1_CH1N與TIM1_CH1兩個一組,通過網路查詢後,明白了晶片這樣設計的原因。 TIM1是

【STM32】SysTick滴答定時(delay延函式講解

STM32F1xx官方資料:《Cortex-M3權威指南-中文》-第8章最後一個小節:Systick定時器SysTick定時器Systick定時器,是一個簡單的定時器,對於CM3、CM4核心晶片,都有Systick定時器。Systick定時器常用來做延時,或者實時系統的心跳時

STM32CubeMX定時控制微秒延詳解

寫在前面的話,為什麼另需定時器進行微秒級延時。 1.在HAL韌體庫中只有使用Systick作為延時計數器,毫秒級延時HAL_Delay()。為了增加精確的微秒級延時,一般都是更改Systick配置引數,但HAL韌體庫許多地方都使用了HAL_Delay()函式,

android獲取全域性Context

1.介紹:Android提供了一個Application類,每當程式啟動的時候,系統就會自動將這個類進行初始化。因此我們                 可以定製一個自己的Application類,以便於管理程式內一

android螢幕適配(三實踐dimens.xml尺寸適配不同的平板

android3.2以後,為了提供更精準的對佈局檔案的控制,可以通過為資原始檔(res目錄下檔案)增加字尾來指定該資料夾裡的xml佈局檔案或color.xml,string.xml是為哪種大小的螢幕使用。 第一種字尾:sw<N>dp,如layout-sw600

自學AndroidUI元件:(二Fragment的基本使用(上

本篇為UI元件的第二篇,主要探討關於Fragment的基本使用,包括簡單的原理以及建立、修改、刪除等操作。 在本篇文章中,你將瞭解到: 1.什麼是Fragment。 2.Fragmen

Maven 下的spring框架(4定時quartz

清明放假三天,沒有時間寫部落格,今天把定時器quartz的使用方法貼出來。通過前三篇的文章,大家的框架都是可以執行的了,那麼下面開始配置quartz。 首先,先把jar包導進來 <!-- 任務排程器 --> <dependency> &l

[HAL庫學習路]7.定時中斷

記錄自己的STM32的HAL庫的學習之路,不定期更新… 一、Pinout 二、Clock Configuration 三、Configuration 定時器溢位時