JobScheduler的使用
2016-05-25 10:24
204 查看
在进行android开发时,会遇到这样的情况:想在将来的某个时间或在一定条件下运行任务,如上传图片、下载歌曲等操作想在接入电源或连接到WIFI时执行。Android L提供了JobScheduler API。
当一组预定义的条件得到满足时,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()实现。
当一组预定义的条件得到满足时,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()实现。
相关文章推荐
- 在css中最常用的长度单位
- Spring框架的学习(零)-简单介绍与入门实例
- 导入本体到Jena TDB数据库
- CloudCore引领核心网云化转型
- dll和so文件区别与构成
- 关于util下的Arrays.sort引起的思考和内部实现的二叉树算法实践
- 解读智能硬件安全隐患 萤石深度保护数据安全
- iOS开发小技巧--TableView中headerView的循环利用,以及自定义的headerView
- Android下拉刷新上拉加载控件,对所有View通用!
- 虚拟机权限不足,无法访问文件
- Android Studio 优秀插件汇总
- Mysql连接函数使用
- 女子拆穿电信诈骗遭报复 1小时被狂呼1200次
- Access-Control-Allow-Origin 站点跨域请求的问题
- [技巧.Dotnet]简单操作,实现强制.net程序以管理员身份运行。
- LintCode 387. The Smallest Difference
- JavaWeb 服务启动时,在后台启动加载一个线程
- spring MVC配置详解
- ProgressDialog高级使用
- Tomcat中使用JNDI时需要注意的地方