jobschedulerのは、タスク・フローをマージ
我々の開発の過程で、我々は、このような位置情報、個人情報の同期化をアップロードするよう、このようなシナリオが発生し、連絡先を同期、これらのタスクはすぐに治療を必要としない、我々は充電、このような接続無線LANとして、特定のシーンで呼び出す必要があります呼び出します。シーンは、タスクの特定の番号の後にリコールさもあります
今回はjobschedulerのマージのワークフローを実現するために使用し、適切なタイミングで実行することができます
例
例では、ここで提供されていますhttps://github.com/ddssingsong/JobManager
ソースのダウンロード:https://download.csdn.net/download/u011077027/11241799
成功した後、サーバーにアップロードした場所、場所を呼び続け楽屋サービスを開き、複数のポジショニングも、結果は、接続無線LANの時にマージアップロードする必要があり
始めます
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() + "任务执行完成......");
}
}