在进行Android开发时,会遇到这样的情况:想在将来的某个时间或在一定条件下运行任务,如上传图片、下载歌曲等操作想在接入电源或连接到WIFI时执行。android L提供了JobScheduler API。
调用:
注册:
如果应用程序需要停止特定或所有工作,可以通过对JobScheduler对象调用cancel(int jobId)或cancelAll()实现。
当一组预定义的条件得到满足时,JobScheduler API的应用程序执行一项操作。不像AlarmManager类,JobScheduler的时间测定是不准确的。此外,该API能够一同批处理各种工作。
JobService:
- public class MyJobService extends JobService {
- private static final String TAG = "MyJobService";
- /**
- * false: 该系统假设任何任务运行不需要很长时间并且到方法返回时已经完成。
- * true: 该系统假设任务是需要一些时间并且当任务完成时需要调用jobFinished()告知系统。
- */
- @Override
- public boolean onStartJob(JobParameters params) {
- Log.i(TAG, "Totally and completely working on job " + params.getJobId());
- if (isNetworkConnected()) {
- new SimpleDownloadTask().execute(params);
- return true;
- } else {
- Log.i(TAG, "No connection on job " + params.getJobId() + "; sad face");
- }
- return false;
- }
- /**
- * 当收到取消请求时,该方法是系统用来取消挂起的任务的。
- * 如果onStartJob()返回false,则系统会假设没有当前运行的任务,故不会调用该方法。
- */
- @Override
- public boolean onStopJob(JobParameters params) {
- Log.i(TAG, "stop job " + params.getJobId());
- return false;
- }
- private boolean isNetworkConnected() {
- ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo info = manager.getActiveNetworkInfo();
- return (info != null && info.isConnected());
- }
- private class SimpleDownloadTask extends
- AsyncTask<JobParameters, Void, String> {
- private JobParameters mJobParam;
- @Override
- protected String doInBackground(JobParameters... params) {
- mJobParam = params[0];
- try {
- InputStream is = null;
- int len = 50;
- URL url = new URL("http://www.baidu.com");
- HttpURLConnection conn = (HttpURLConnection) url
- .openConnection();
- conn.setReadTimeout(10000);
- conn.setConnectTimeout(15000);
- conn.setRequestMethod("GET");
- conn.connect();
- int responseCode = conn.getResponseCode();
- Log.i(TAG, "response code is : " + responseCode);
- is = conn.getInputStream();
- Reader reader = null;
- reader = new InputStreamReader(is, "UTF-8");
- char[] buffer = new char[len];
- reader.read(buffer);
- return new String(buffer);
- } catch (Exception e) {
- return "unable to retrieve web page";
- }
- }
- @Override
- protected void onPostExecute(String result) {
- jobFinished(mJobParam, false);
- Log.i(TAG, "获取结果:" + result);
- }
- }
- }
调用:
- public class MainActivity extends Activity {
- private TextView result;
- private ComponentName jobService;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- jobService = new ComponentName(this, MyJobService.class);
- Intent service = new Intent(this, MyJobService.class);
- startService(service);
- result = (TextView) findViewById(R.id.result_tv);
- Button btn = (Button) findViewById(R.id.button);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- pollServer();
- }
- });
- }
- private void pollServer() {
- JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
- int jobId;
- for (int i = 0; i < 10; i++) {
- jobId = i;
- JobInfo jobInfo = new JobInfo.Builder(jobId, jobService)
- .setMinimumLatency(5000)// 设置任务运行最少延迟时间
- .setOverrideDeadline(60000)// 设置deadline,若到期还没有达到规定的条件则会开始执行
- .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 设置网络条件
- .setRequiresCharging(true)// 设置是否充电的条件
- .setRequiresDeviceIdle(false)// 设置手机是否空闲的条件
- .build();
- result.append("scheduling job " + i + "!\n");
- scheduler.schedule(jobInfo);
- }
- }
- }
注册:
- <service
- android:name="com.example.jobschedulerdemo.MyJobService"
- android:permission="android.permission.BIND_JOB_SERVICE" >
- </service>
如果应用程序需要停止特定或所有工作,可以通过对JobScheduler对象调用cancel(int jobId)或cancelAll()实现。