Alarm鬧鐘定時任務的處理步驟

首先,調用AlarmManager這個類是必須的,自定義個setAlarmTime方法,如下代碼:

public void setAlarmTime(Context context,long timeInMillis) {
    AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
   Intent intent = new Intent();
   intent.setAction("orderDialog_Result");
   Log.e("預約定時任務", "預約定時任務");
   PendingIntent sender = PendingIntent.getBroadcast(
       context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
   am.set(AlarmManager.RTC_WAKEUP, timeInMillis,sender);
   }

pendingintent中的三個參數:

第一個是上下文,第二個參數是鬧鐘的id,可是設置多個鬧鐘,第三個是動作、意圖

這個方法最重要的是am.set()方法中的三個參數,分別來介紹下:

第一個參數表示鬧鐘的類型,可以爲:
ELAPSED_REALTIME  當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是相對時間,是從系統啓動後開始計時的,包括睡眠時間,可以通過調用SystemClock.elapsedRealtime()獲得。系統值是3    (0x00000003)。  
ELAPSED_REALTIME_WAKEUP 能喚醒系統,用法同ELAPSED_REALTIME,系統值是2 (0x00000002) 。  
RTC  當系統進入睡眠狀態時,這種類型的鬧鈴不會喚醒系統。直到系統下次被喚醒才傳遞它,該鬧鈴所用的時間是絕對時間,所用時間是UTC時間,可以通過調用 System.currentTimeMillis()獲得。系統值是1 (0x00000001) 。  
RTC_WAKEUP 能喚醒系統,用法同RTC類型,系統值爲 0 (0x00000000) 。
前兩者使用相對時間,時間從系統啓動開始算起,SystemClock.elapsedRealtime()可以獲得當前的相對時間,單位爲毫秒,例如:alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5000, sender);  
後兩者使用絕對時間,時間以1970.1.1號爲參考時間,System.currentTimeMillis()獲取從1970.1.1號以來的時間,單位爲毫秒,例如:alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, sender);  

其次,動作sender中 intent.setAction("orderDialog_Result");發送廣播條件,需要建立一個廣播接收者類,如下代碼:

public class CallAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
 intent.setClass(context, AlarmAlert.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 context.startActivity(intent);
}


最後,清單文件androidmanifext.xml中註冊:

<receiver
           android:name="com.clock.CallAlarmReceiver"
           android:enabled="true"
           android:exported="true" >
            <intent-filter>
               <action android:name="orderDialog_Result" />
               <action android:name="android.intent.action.BOOT_COMPLETED" />
           </intent-filter>
       </receiver>


這樣一個簡單的鬧鐘定時任務完成了,這樣子有一個bug,就是手機重啓後,定時任務就不會執行,am.set()方法只是保存在alarmmanager中的一個arraylist中,當手機重啓後,並未保存到外存,因此數據消失,若想開機照樣執行則:

首先在清單文件增加Uses permission使用權限:android.permission.RECEIVE_BOOT_COMPLETED;這個權限是重啓的時候發出廣播通知,然後在清單文件androidmanifext.xml中添加過濾條件:  <action android:name="android.intent.action.BOOT_COMPLETED" />
這樣就行,只需要在廣播接收Onreceive()方法中你自己需要的動作就行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章