Android 基础知识之JobScheduler基本使用

1.导读

在实际的开发过程中,你可能需要满足特定情况下,比如联网,充电,执行相应的操作

2.绑定服务

JobService 继承于service ,所以也需要在manifest中绑定。在绑定时要加上找个权限

 <service
 		android:name=".MyJob"
 		android:permission="android.permission.BIND_JOB_SERVICE" />

否则会报错下面的错误。

Caused by: java.lang.IllegalArgumentException: Scheduled service ComponentInfo{iflytek.com.jobschedulertest/iflytek.com.jobschedulertest.MyJob} does not require android.permission.BIND_JOB_SERVICE permission

3.实现

  • 创建一个JobService,当任务开始时会执行onStartJob,参数是通过JobScheduler传过来的,返回值时Boolean型,返回为true,表示找个job继续执行,除非不满条件或者调用jobFinished,返回false表示结束job。返回值在设置时还有比较有迷惑性的,若是你想设置每个5s执行一次,找个返回值就要设置false,为什么呢?因为返回false说明当前任务完成了,需要进行下次的job。
    MyJobService类
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        Toast.makeText(getApplicationContext(), "JobService task running " + params.getExtras().getString("key"), Toast.LENGTH_SHORT).show();
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startS();
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void startS() {
        JobScheduler mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        JobInfo.Builder jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), MyJobService.class.getName()));
        PersistableBundle persistableBundle = new PersistableBundle();
        persistableBundle.putString("key", "JobService");
        jobInfo.setPeriodic(1000 * 6);//每个6s发送一次
        jobInfo.setPersisted(true);//重启后保留任务
        jobInfo.setExtras(persistableBundle);//传输数据
        jobInfo.setRequiresCharging(false);//不充电
        jobInfo.etRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);//任意网络
        mJobScheduler.schedule(jobInfo.build());
    }
}

JobScheduler 是通过系统服务来获取的 getSystemService(Context.JOB_SCHEDULER_SERVICE),通过JobInfo来设置相应的配置信息,来完成任务。
在Android 8.0时,需要设置 jobInfo.setPeriodic(1000 * 60*15),必须设置15分钟才行能执行,从源码中可以看出来,否则不执行。

jobInfo.setPeriodic(1000 * 6);//每个6s发送一次
jobInfo.setPersisted(true);//重启后保留任务
jobInfo.setExtras(persistableBundle);//传输数据
jobInfo.setRequiresCharging(false);//不充电
jobInfo.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);//任意网络
jobInfo.setsetRequiresDeviceIdle(true);//设置是否空闲使用
jobInfo.setRequiresBatteryNotLow(true);//不允许电量低的情况下运行。

你可能感兴趣的:(Android)