Android JobService利用JobScheduler定期执行任务

在以前我们做轮询用过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" />
0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x