原文地址:Android開發 定時任務清理資料 | Stars-One的雜貨小窩
公司專案,需要整定時任務,對資料進行清理,需要在每天凌晨0:00進行資料的清理,使用了Alarm和廣播的方式來實現
PS:基於此原理,也可以實現自動檢測並更新apk的功能
實現
實現的原理為:
1.進入APP,啟動鬧鐘,設定一個鬧鐘服務(在某個時間點會觸發任務),任務中其實主要是發出一個廣播
2.設定廣播接收器裡的邏輯,其中包含清理資料和重新設定鬧鐘服務(即上述第一步)
之後即可一直迴圈,可以保證穩定執行
鬧鐘
設定一個鬧鐘服務,指定第二天的凌晨0:00:00開始觸發任務
//構造一個PendingIntent物件(用於傳送廣播)
//注:ALARM_ACTION_CODE這個是action,後面需要匹配判斷
String ALARM_ACTION_CODE = "ALARM_ACTION_CODE";
Intent intent = new Intent(ALARM_ACTION_CODE);
//適配8.0以上(不然沒法發出廣播)
if (DeviceUtils.getSDKVersionCode() > Build.VERSION_CODES.O) {
intent.setComponent(new ComponentName(this, DataDeleteReceiver.class));
}
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
1, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
//在第二天的0:00清理髮出清理資料的廣播
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.DAY_OF_MONTH, 1);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
KLog.d("鬧鐘已啟動,預定觸發時間:" + TimeUtils.date2String(calendar.getTime()));
廣播接收邏輯
直接通過Android Studio的選單直接新建一個廣播
enabled
和exported
都勾選即可
當時間到點後,系統會傳送一個廣播,我們程式需要去接收此問題
public class DataDeleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//匹配下之前定義的action
if ("ALARM_ACTION_CODE".equals(action)) {
KLog.d("-----定時清理資料-----");
//刪除資料(需要開個子執行緒去操作)
//這裡重新設定定時器
//方便起見,這裡我是跳轉回MainActivity去重新執行了
EventBus.getDefault().post(new AlarmEvent());
}
}
}
補充——定時任務的8種方式
Java SDK:
- while迴圈+sleep
- 遞迴+sleep
- Timer、TimerTask
- ScheduledExecutorService(帶有定時任務的執行緒池)
Android SDK:
- Handler迴圈發訊息
- Handler的postDelayed方法
- BroadcastReceiver迴圈自發廣播
- AlarmManger+BroadcastReceiver定時傳送廣播