JobScheduler合并任務流
在我們開發的過程中,我們會遇到這樣一種場景,如上傳定位資訊、同步個人資訊、同步聯系人,這些任務并不需要即時處理,需要在特定的場景調用,如連接配接wifi、充電時調用。還有一種場景是任務達到一定的數量之後再調用
這時候我們可以使用JobScheduler來實作合并工作流并在合适的時間執行
例子
這裡提供一個例子:https://github.com/ddssingsong/JobManager
源碼下載下傳:https://download.csdn.net/download/u011077027/11241799
開啟一個背景Service不停的調用定位,定位成功之後上傳到伺服器,這裡需要将多個定位結果合并起來并在連接配接wifi的時候進行上傳
開始
public class JobManager {
public static final String TAG = "dds_JobManager";
private static JobManager instance;
private JobScheduler jobScheduler;
private Context context;
private static final int jobId = 0; // 任務ID
public static JobManager getInstance() {
if (null == instance)
instance = new JobManager();
return instance;
}
public void init(Context context) {
this.context = context.getApplicationContext();
jobScheduler = (JobScheduler)
context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
}
/**
* 添加一個任務
*
* @param location 需要發送的内容
*/
public void addJob(String location) {
if (null == jobScheduler) {
return;
}
JobInfo pendingJob = null;
//整合多個job,7.0之上和之下不太一樣
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
pendingJob = jobScheduler.getPendingJob(jobId);
} else {
List<JobInfo> allPendingJobs = jobScheduler.getAllPendingJobs();
for (JobInfo info : allPendingJobs) {
if (info.getId() == jobId) {
pendingJob = info;
break;
}
}
}
//找到待執行的job
if (null != pendingJob) {
//多個坐标資訊拼到一起 上傳
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//資料 與Intent 一樣
PersistableBundle extras = pendingJob.getExtras();
//獲得上一次設定的location資料
String data = extras.getString("DATA");
//比如 多條坐标資料用@隔開
location = data + "@" + location;
jobScheduler.cancel(jobId);
}
}
PersistableBundle extras = new PersistableBundle();
extras.putString("DATA", location);
//建立一個job
JobInfo jobInfo = new
JobInfo.Builder(jobId,
new ComponentName(context, MyJobService.class))
//隻在充電的時候
.setRequiresCharging(true)
//不是蜂窩網絡
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setExtras(extras).build();
//送出任務
Log.e(TAG, "送出任務");
jobScheduler.schedule(jobInfo);
}
}
public class MyJobService extends JobService {
public static final String TAG = "dds_MyJobService";
@Override
public boolean onStartJob(JobParameters params) {
new MyAsyncTask(this).execute(params);
return true;
}
//當系統接收到一個取消請求時
@Override
public boolean onStopJob(JobParameters params) {
//如果onStartJob傳回false,那麼onStopJob不會被調用
// 傳回 true 則會重新計劃這個job
return false;
}
static class MyAsyncTask extends AsyncTask<JobParameters, Void, Void> {
private JobParameters jobParameters;
private WeakReference<MyJobService> myJobServiceWeakReference;
public MyAsyncTask(MyJobService myJobService) {
myJobServiceWeakReference = new WeakReference<>(myJobService);
}
@Override
protected Void doInBackground(JobParameters[] objects) {
jobParameters = objects[0];
Log.i(TAG, jobParameters.getJobId() + " 任務開始執行......");
PersistableBundle extras = jobParameters.getExtras();
String location = extras.getString("DATA");
Log.i(TAG, jobParameters.getJobId() + " 上傳:" + location);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
*/
@Override
protected void onPostExecute(Void s) {
//true表示需要重複執行
//false反之
myJobServiceWeakReference.get().jobFinished(jobParameters, false);
Log.i(TAG, jobParameters.getJobId() + "任務執行完成......");
}
}