JobService 和 JobScheduler Android5.0以上的进程保活
Android 5.0 新增了一个 JobScheduler API,允许您定义一些系统在稍后或指定条件下(如设备充电时)以异步方式运行的作业,从而优化电池寿命。下列情形下,作业计划排定功能很有用:
• 应用具有不面向用户并且可以推迟的作业
• 应用具有您更愿意在设备插入电源时再进行的作业
• 应用具有一项需要接入网络或连接 WLAN 的任务。
• 应用具有多项您希望定期以批处理方式运行的任务。
演示demo如下:
1.创建自定义的 Service 继承 JobService
public class MyJobService extends JobService {
}
重写 onStartJob 方法,返回true表示正在执行,此处模拟执行耗时操作的task
public boolean onStartJob(JobParameters params) {
Log.e(TAG, "onStartJob jobId = " + params.getJobId());
new SimpleTask().execute(params);
return true;
}
private class SimpleTask extends AsyncTask<JobParameters, Void, String> {
private JobParameters mJobParam;
@Override
protected String doInBackground(JobParameters... params) {
mJobParam = params[0];
sendMessage(MainActivity.MSG_JOB_START, mJobParam);
try {
Thread.sleep(3000);
return new String("任务执行结束--->");
} catch (Exception e) {
return "ERROR";
}
}
@Override
protected void onPostExecute(String result) {
jobFinished(mJobParam, false); // 手动结束
Log.e(TAG, "获取结果:" + result);
sendMessage(MainActivity.MSG_JOB_STOP, mJobParam);
}
}
2. 在 Manifest 中声明:
<service
android:name=".service.MyJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
3. 在 activty 中启动任务
private void init() {
mHandler = new IncomingMessageHandler(this);
Intent startServiceIntent = new Intent(this, MyJobService.class);
Messenger messengerIncoming = new Messenger(mHandler);
startServiceIntent.putExtra("messenger", messengerIncoming);
startService(startServiceIntent);
mJobScheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
}
这里分为两种方式,需要注意的是,以Periodic方式大约是15分钟执行一次,而另一种是立即执行
private void startJob(boolean isPeriodic) {
ComponentName jobService = new ComponentName(this, MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(jobId++, jobService);
if (isPeriodic) {
builder.setPeriodic(3000);
} else {
builder.setMinimumLatency(1000);
builder.setOverrideDeadline(1000 * 30);
}
// 设置网络条件
builder.setRequiresCharging(false); // 设置是否充电
builder.setRequiresDeviceIdle(false); // 设置手机是否空闲
JobInfo jobInfo = builder.build();
mJobScheduler.schedule(jobInfo);
}
DEMO说明: 点击start with perodic 会间隔15分钟执行一次任务,而点击 start with deadline 会立即启动
DEMO 下载地址:
http://download.csdn.net/download/desireyaoo/10174343