好多企业都想让自己的进程持续在后台运行,其实现在这样的需求根本实现不了了,手机自带的清后台功能基本上能清理掉所有的后台进程,除非我们的应用是系统级别的应用。
这里要说的进程保活,是当手机中的应用开的太多的时候,系统进行自动清理进程的时候,我们的应用能够不被清理,或者清理掉之后能够自动重启。
JobService
也是一个service
,和普通的service
不同的是,JobService
是一个任务回调类,通过JobScheduler
设置任务给系统,系统来调用JobService
中的方法,具体处理什么任务需要我们自己在JobService
中的回调方法中实现。那么关于任务的管理和进程的维护、调度当然是由系统来统一管理。
service
类继承JobService
public class GuardJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
Log.e("service","GuardJobService--onStartJob");
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.e("service","GuardJobService--onStopJob");
return false;
}
}
第一个方法表示开始工作,第二个是停止工作,JobService
只是JobScheduler
的回调类,开始工作方法和停止工作方法都是系统来调用的,我们通过JobScheduler
类来设置开始工作的条件,当条件符合的时候系统会调用JobService
中的方法来开始工作。
public void setJobInfo(){
JobInfo.Builder ex = new JobInfo.Builder(1, new ComponentName(this.getPackageName(), GuardJobService.class.getName()));
ex.setPeriodic(500L); //设置执行间隔时间
//ex.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE); //设置需要的网络环境
//ex.setMinimumLatency(3000); // 设置任务运行最少延迟时间
//ex.setRequiresCharging(true); //设置是否在充电的时候执行
jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE);
int ret = jobScheduler.schedule(ex.build()); //设置给JobScheduler
Log.e("service","GuardJobService--getJobInfo -- ret::" + ret);
}
最后调用schedule
方法,我们就把设置好的开始工作的条件设置给系统,当满足我们设置的条件的时候,系统就会去回调JobService
中的onStartJob
方法。
注意:
onStartJob这个回答方法是运行在主线程的。
然后在JobService中调用这个方法,设置给系统。
@Override
public void onCreate() {
super.onCreate();
getJobInfo();
Log.e("service","GuardJobService--onCreate");
}
为了实现进行的保活,我把JobService
单独放到一个进程中。
到此JobService
就配置好了,下面创建一个Service
,在这个服务中开启JobService
public class TestService extends Service{
@Override
public void onCreate() {
super.onCreate();
Log.e("service","TestService--onCreate");
Intent ret = new Intent(TestService.this, GuardJobService.class);
startService(ret);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("service","TestService-- onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
}
下面开始测试,在TestService中开启GuardJobService,看我们打印的日志,然后通过adb杀进程来测试进程能不能重启,当然得使用root的手机来测试。
/com.test.testapp E/service: TestService--onCreate
/com.test.testapp E/service: TestService-- onStartCommand
/com.test.testapp:guard E/service: GuardJobService--getJobInfo -- ret::1
/com.test.testapp:guard E/service: GuardJobService--onCreate
/com.test.testapp:guard E/service: GuardJobService--onStartCommand
首先走到TestService
的onCreate
和OnStartCommand
方法,然后进入JobService
中的OnCreate
方法和OnStartCommand
方法。通过日志可以看到有两个进程,一个com.test.testapp
,一个com.test.testapp:guard
com.test.safe
杀死com.test.safe
进程以后,发现该进程马上就重启了,并打印下面的日志
/com.test.testapp E/service: TestService--onCreate
/com.test.testapp:guard E/service: GuardJobService--onStartCommand
/com.test.testapp E/service: TestService-- onStartCommand
说明TestService
被重启了,走了onCreate
和onStartCommand
方法,因为JobService
本来就存在,所以再次开启这个服务的时候只会走onStartCommand
方法。
com.test.testapp:guard
发现被杀死的guard
进程也被快速重启,打印日志如下:
/com.test.testapp:guard E/service: GuardJobService--getJobInfo -- ret::1
/com.test.testapp:guard E/service: GuardJobService--onCreate
/com.test.testapp:guard E/service: GuardJobService--onStartCommand
发现进程重启走了JobService
的onCreate
和onStartCommand
方法
测试结果表明,调用了JobService
以后,当所在的进程被杀死的时候就会被系统调起,具体原因是我感觉是因为JobService
的任务是由系统来维护的,当还有任务没有完成的时候系统会调起所在的进程,而我们设置的条件是每500毫米执行一次任务,其他的条件都没有设置,而我们在onStartJob
和onStopJob
方法中返回false
,而且没有代码需要执行,表示我们没有任务需要执行,直接告诉系统任务执行完毕,所以系统就会每隔500毫米执行一次任务,调起一下进程。
当然,原因都是我通过官方的接口说明推测的,并没有通过源码去详细分析,但是总之,使用JobService做到了进程的保活。如果在保险一点,可以在JobService
的onCeate
方法中添加启动TestService
的方法。
测试代码地址:https://github.com/staticzh/JobService
欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。
<