談談對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小時)