1. 程式人生 > >談談對Android定時任務中AlarmManager的理解

談談對Android定時任務中AlarmManager的理解

Android定時任務

前言

我們在平常的開發中可能會遇到一些需求,比如說,每日定時提醒,定時更新資料等等,反正就是週期性任務,碰到這類需求,我們就可以叫做定時任務。以前我們可以通過使用執行緒Handler來實現,現在既然是在android手機裡面,那就更加好辦了,android給我們提供了一個AlarmManager這個玩意。它是一種系統級別的定時提示服務,並且可以執行在app的生命週期之外,還是比較強大的吧。

需求

假如說我們現在有個需求,就是每天早上7點要執行一個任務,並且每隔一段時間又會執行一次。

編碼

首先肯定是需要個Receiver(廣播)來執行那個任務,這裡面內容比較簡單,就是Toast一句話

public class AlramReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"定時任務開始了",Toast.LENGTH_SHORT).show();

    }
}

別忘了,在AndroidManifest中配置它。

接下來在我們的主介面去開啟這個定時任務

public class MainActivity extends AppCompatActivity
{
private Button mOpen; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mOpen= (Button) findViewById(R.id.open_btn); mOpen.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar calendar=Calendar.getInstance(); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.HOUR_OF_DAY,7); int interval=1000*60*60;//一個小時的間隔 long triggerAtTime = System.currentTimeMillis(); Intent i = new Intent(this, AlramReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); manager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime,interval, pi); } }); } }

接下來我將詳細的解釋下AlarmManager裡面一些方法
1.set(int type,long startTime,PendingIntent pi);

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

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

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

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

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

type:鬧鐘型別,有五個可選值

1.ELAPSED_REALTIME:以手機開機的時間為基準

2.ELAPSED_REALTIME_WAKEUP:以手機開機的時間為基準,並且可以在休眠時發出廣播

3.RTC:以UTC標準時間為基準

4.RTC_WAKEUP:以UTC標準時間為基準,並且可以在休眠時發出廣播。這種方式是最常見的形式。

5.POWER_OFF_WAKEUP:關機狀態下也能進行提示

long startTime:

表示鬧鐘第一次執行的時間,可以自己設定,也可以使用系統當前時間,以毫秒為單位。本屬性與第
一個屬性(type)密切相關,如果第一個引數對 應的鬧鐘使用的是相對時間(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP), 那麼本屬性就得使用相對時間(相對於 系統啟動時間來
說),比如當前時間就表示為:SystemClock.elapsedRealtime(); 如果第一個引數對應的鬧鐘使用的是絕對時間 (RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那麼本屬性就得使用絕對時間, 比如當前時間就表示 為:System.currentTimeMillis()。

long intervalTime:
鬧鐘的間隔時間,也是毫秒為單位。

PendingIntent pi:
這個就是我們可以執行的動作,可以去啟動一個service,傳送一個廣播,啟動一個activity,方法一看就明白了。
最後一個小提示:
Calendar.HOUR_OF_DAY (24小時)
Calendar.HOUR (12小時)