我的原文:http://blog.csdn.net/brycegao321/article/details/52312030

有图有真相, 亲测锤子T2、华为Mate8手机杀掉进程后能自启, 我设置的自启时间间隔为500ms(仅仅是为了测试)。


首先要明确保活的概念:

1、非android核心进程(例如com.android.phone)都可以被干掉;

2、保活并不能真正的保证app进程不死, 而是能在被干掉后马上启动;


Android系统按照进程的优先级分为:

1. 前台进程(Forgroud process): 顶层activity(已执行onResume); 有个Service,并绑定到跟用户正在交互的activity;在Service里调用了startForground函数;正在执行onReceive函数的BroadCastReceiver。

2. 可见进程(Visible process): 被对话框遮挡的activity, 执行了onPause; 拥有绑定到Activity的Service, 但该Activity被遮挡了, 例如按Home键,并执行了onStop。
3. 服务进程(Service process): 有正在运行的Service, 但是没有1/2的特性。

4. 后台进程(Background process)没有正在运行的Service, 只有不可见的Activity, 即Activity执行了onStop函数。

5. 空进程(Empty Process), 不含Android 4大组件的进程。


按照Android的设计, app只能提高自己的进程优先级, 降低被杀掉的概率。


我们更关心的是进程被干掉后怎么拉起来, 有如下几个方法:

1、 注册静态BroadcastReceiver, 监听系统广播;

2、 启动一个服务, 并覆盖Service的onStartCommand函数, 返回Service.START_STICKY。 用处是被gc回收后在以后某个时间被系统拉起来, 然并卵, 并不是我们想要的。

3. 使用Native进程保活, Android5.0以下好用, 在Android5.0以上就废了, 所以不细说了。

4. 使用JobSheduler机制保活, 上帝在关闭一扇门的时候(native进程保活废弃了),打开了一扇窗(JobSheduler替代了native进程方式)。

5. 家族系app互拉, 例如百度旗下所有app, 启动其中一个app时, 它会拉起百度旗下其他app进程。作法很流氓, 也是厂商和用户深恶痛绝的。


以下是参考代码, 只是为验证进程能自启, 所以写的很简单

publicclassMyJobServiceextendsJobService{@OverridepublicvoidonCreate(){super.onCreate();startJobSheduler();}publicvoidstartJobSheduler(){try{intid=1;JobInfo.Builderbuilder=newJobInfo.Builder(id,newComponentName(getPackageName(),MyJobService.class.getName()));builder.setPeriodic(500);//间隔500毫秒调用onStartJob函数,500只是为了验证JobSchedulerjobScheduler=(JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE);intret=jobScheduler.schedule(builder.build());}catch(Exceptionex){ex.printStackTrace();}}@OverridepublicbooleanonStartJob(JobParametersjobParameters){Log.d("brycegao","onStartJobalive");returnfalse;}@OverridepublicbooleanonStopJob(JobParametersjobParameters){Log.d("brycegao","onStopJobalive");returnfalse;}}

<serviceandroid:name=".MyJobService"android:permission="android.permission.BIND_JOB_SERVICE"/>




我的微信公众号, 欢迎关注, 让我们一起成长