在以前我们做轮询用过Timer和Service来实现,但这么做是很耗电的,他们是一直在跑任务,根本做不到节能,但后来谷歌考虑节电,出了这个心玩意JobService和JobScheduler来就行任务管理,这样就会比较省电,省电的原理是只有在打到设定好的条件后才去执行。
这两天刚开始研究这货发现并没有想象那么好弄(主要是不好理解),我想做一个类似于轮询的效果,但写了好几天都没能成功,今天又去试了试发现可以了,下面我跟大家分享一下。
首先我们先创建Service,当然这个Service我们需要使用JobService来扩展,代码如下
package com.lmm.jobschedulerdemo.service;
import android.annotation.TargetApi;
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.os.Build;
import android.util.Log;
@TargetApi(Build.VERSION_CODES.LOLLIPOP) //这里的标识注明只有在Android 5.0及以上才可以用
public class JobSchedulerService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
doJob(params);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.i("stop service","stop job service");
return false;
}
private void doJob(JobParameters params) {
Log.i("do service","do job service");
}
}
以上就是JobSercie扩展类的定义,必须实现onStartJob和onStopJob这两个方法,其中onStartJob方法的返回值作用如下:
– 返回true 说明在这个方法里需要执行耗时操作,大家都知道耗时操作应该放到子线程去做,在执行完毕耗时操作后需要手动告诉系统已经执行完毕耗时工作,需要调用jobFinished(params,true) params和onStartJob的params相同,后边这个bool类型的参数代表是否要重复执行。
– 返回false的话那么执行完这个方法说明任务已经执行完毕了,这里的任务肯定是非耗时操作。
定义好JobService之后我们来说怎么使用它,还是老规矩先贴代码
package com.lmm.jobschedulerdemo;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.TimeUtils;
import com.lmm.jobschedulerdemo.service.JobSchedulerService;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
doService();
}
Intent intent = new Intent(this,JobSchedulerService.class);
startService(intent);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void doService() {
JobScheduler jobScheduler = (JobScheduler)getSystemService(JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(this,JobSchedulerService.class));
//设置延迟执行时间
// builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(10));
// 设置最大延迟执行时间
// builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(15));
//这只需要的网络类型
// builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NOT_ROAMING);
builder.setBackoffCriteria(TimeUnit.MILLISECONDS.toMillis(10),JobInfo.BACKOFF_POLICY_LINEAR);
// builder.setRequiresCharging(true);
// builder.setPeriodic(TimeUnit.MILLISECONDS.toSeconds(5000));
builder.setPeriodic(60 * 1000);
jobScheduler.schedule(builder.build());
}
}
通过以上代码就可以实现完整的轮询,哦,不好意思忘记说在AndroidManifest.xml里设置我们写好的Service,大家都知道我们定义好Service之后都需要去AndroidManifest.xml里去定义,但JobService有些不同需要添加permission定义,代码如下:
<service
android:name=".service.JobSchedulerService"
android:permission="android.permission.BIND_JOB_SERVICE" />