使用JobService做进程保活

好多企业都想让自己的进程持续在后台运行,其实现在这样的需求根本实现不了了,手机自带的清后台功能基本上能清理掉所有的后台进程,除非我们的应用是系统级别的应用。

这里要说的进程保活,是当手机中的应用开的太多的时候,系统进行自动清理进程的时候,我们的应用能够不被清理,或者清理掉之后能够自动重启。

什么是JobService

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");
}
在清单文件中注册Service
 <service
   android:name=".GuardJobService"
   android:exported="true"
   android:permission="android.permission.BIND_JOB_SERVICE"
   android:process=":guard" />

为了实现进行的保活,我把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的手机来测试。

直接开启JobService
/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

首先走到TestServiceonCreateOnStartCommand方法,然后进入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被重启了,走了onCreateonStartCommand方法,因为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

发现进程重启走了JobServiceonCreateonStartCommand方法

总结

测试结果表明,调用了JobService以后,当所在的进程被杀死的时候就会被系统调起,具体原因是我感觉是因为JobService的任务是由系统来维护的,当还有任务没有完成的时候系统会调起所在的进程,而我们设置的条件是每500毫米执行一次任务,其他的条件都没有设置,而我们在onStartJobonStopJob方法中返回false,而且没有代码需要执行,表示我们没有任务需要执行,直接告诉系统任务执行完毕,所以系统就会每隔500毫米执行一次任务,调起一下进程。

当然,原因都是我通过官方的接口说明推测的,并没有通过源码去详细分析,但是总之,使用JobService做到了进程的保活。如果在保险一点,可以在JobServiceonCeate方法中添加启动TestService的方法。

测试代码地址:https://github.com/staticzh/JobService

欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。

<

 张鹤的公众号

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值