JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
获得任务调度实例后,即可进行任务调度操作,下面是任务调度的相关方法:- public final IBinder onBind(Intent intent) {
- return mBinder.asBinder();
- }
JobService实现了onBind方法,表示任务调度在工作的时候,JobService是通过绑定方式启动的。- public final void jobFinished(JobParameters params, boolean needsReschedule) {
- ensureHandler();
- Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params);
- m.arg2 = needsReschedule ? 1 : 0;
- m.sendToTarget();
- }
因为JobService由系统触发,不是在App的主线程中,所以这里通过Message机制与主线程进行通信。- //将任务作业发送到作业调度中去
- public void scheduleJob() {
- Log.d(TAG, "scheduleJob");
- JobInfo.Builder builder = new JobInfo.Builder(0,
- new ComponentName(this, SimpleJobService.class));
- //设置需要的网络条件,默认为JobInfo.NETWORK_TYPE_NONE即无网络时执行
- //NETWORK_TYPE_NONE
- builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
- //builder.setPersisted(true); //重启后是否还要继续执行
- builder.setRequiresCharging(false); //是否在充电时执行
- builder.setRequiresDeviceIdle(false); //是否在空闲时执行
- //builder.setPeriodic(1000); //设置时间间隔,单位毫秒
- //setPeriodic不能和setMinimumLatency、setOverrideDeadline这两个同时调用
- //否则会报错“java.lang.IllegalArgumentException: Can't call setMinimumLatency() on a periodic job”
- //“java.lang.IllegalArgumentException: Can't call setOverrideDeadline() on a periodic job”
- builder.setMinimumLatency(500); //设置至少延迟多久后执行,单位毫秒
- builder.setOverrideDeadline(3000); //设置最多延迟多久后执行,单位毫秒
- JobInfo ji = builder.build();
- JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
- js.schedule(ji);
- }
- public class SimpleJobService extends JobService {
- private final static String TAG = "SimpleJobService";
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- JobParameters param = (JobParameters) msg.obj;
- jobFinished(param, true);
- Log.d(TAG, "jobFinished");
- }
- };
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Log.d(TAG, "onStartCommand");
- return START_NOT_STICKY;
- }
- @Override
- public boolean onStartJob(JobParameters params) {
- Log.d(TAG, "onStartJob");
- Message message = Message.obtain();
- message.obj = params;
- mHandler.sendMessage(message);
- //返回false表示执行完毕,返回true表示需要开发者自己调用jobFinished方法通知系统已执行完成
- return true;
- }
- @Override
- public boolean onStopJob(JobParameters params) {
- //停止,不是结束。jobFinished不会直接触发onStopJob
- //必须在“onStartJob之后,jobFinished之前”取消任务,才会在jobFinished之后触发onStopJob
- Log.d(TAG, "onStopJob");
- mHandler.removeMessages(0);
- return true;
- }
- }
- <service
- android:name=".service.SimpleJobService"
- android:permission="android.permission.BIND_JOB_SERVICE" />
- public class MultiJobService extends JobService {
- private final static String TAG = "MultiJobService";
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- JobParameters param = (JobParameters) msg.obj;
- jobFinished(param, true);
- Intent intent = new Intent(getApplicationContext(), MainActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
- }
- };
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Log.d(TAG, "onStartCommand");
- scheduleJob();
- return START_NOT_STICKY;
- }
- @Override
- public boolean onStartJob(JobParameters params) {
- Log.d(TAG, "onStartJob");
- Message message = Message.obtain();
- message.obj = params;
- mHandler.sendMessage(message);
- //返回false表示执行完毕,返回true表示需要开发者自己调用jobFinished方法通知系统已执行完成
- return true;
- }
- @Override
- public boolean onStopJob(JobParameters params) {
- Log.d(TAG, "onStopJob");
- mHandler.removeMessages(0);
- return true;
- }
- //将任务作业发送到作业调度中去
- public void scheduleJob() {
- Log.d(TAG, "scheduleJob");
- JobInfo.Builder builder = new JobInfo.Builder(0,
- new ComponentName(this, MultiJobService.class));
- //设置需要的网络条件,默认为JobInfo.NETWORK_TYPE_NONE即无网络时执行
- builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
- //重启后是否还要继续执行,此时需要声明权限RECEIVE_BOOT_COMPLETED
- //否则会报错“java.lang.IllegalArgumentException: Error: requested job be persisted without holding RECEIVE_BOOT_COMPLETED permission.”
- //而且RECEIVE_BOOT_COMPLETED需要在安装的时候就要声明,如果一开始没声明,在升级时才声明,那么依然会报权限不足的错误
- builder.setPersisted(true);
- builder.setRequiresCharging(false); //是否在充电时执行
- builder.setRequiresDeviceIdle(false); //是否在空闲时执行
- builder.setPeriodic(1000); //设置时间间隔,单位毫秒
- JobInfo ji = builder.build();
- JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
- js.schedule(ji);
- }
- }
- <service
- android:name=".service.MultiJobService"
- android:permission="android.permission.BIND_JOB_SERVICE" />
联系客服