Android5.0以上app进程保活的正确姿势

最是人间留不住,朱颜辞镜花辞树。这篇文章主要讲述Android5.0以上app进程保活的正确姿势相关的知识,希望能为你提供帮助。
      我的原文:  http://blog.csdn.net/brycegao321/article/details/52312030          

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

                                   

Android5.0以上app进程保活的正确姿势

文章图片
   
Android5.0以上app进程保活的正确姿势

文章图片


 
                    首先要明确保活的概念:

                    1、非android核心进程(例如com.android.phone)都可以被干掉;
            2、保活并不能真正的保证app进程不死,  而是能在被干掉后马上启动;


【Android5.0以上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进程。作法很流氓,  也是厂商和用户深恶痛绝的。



以下是参考代码, 只是为验证进程能自启, 所以写的很简单
Android5.0以上app进程保活的正确姿势

文章图片


public  class  MyJobService  extends  JobService  {        @Override        public  void  onCreate()  {                super.onCreate();                 startJobSheduler();         }        public  void  startJobSheduler()  {                try  {                        int  id  =  1;                         JobInfo.Builder  builder  =  new  JobInfo.Builder(id,                                        new  ComponentName(getPackageName(),  MyJobService.class.getName()  ));                         builder.setPeriodic(500);     //间隔500毫秒调用onStartJob函数,  500只是为了验证                        JobScheduler  jobScheduler  =  (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE);                         int  ret  =  jobScheduler.schedule(builder.build());                 }  catch  (Exception  ex)  {                         ex.printStackTrace();                 }         }        @Override        public  boolean  onStartJob(JobParameters  jobParameters)  {                 Log.d("brycegao",  "onStartJob  alive");                 return  false;         }        @Override        public  boolean  onStopJob(JobParameters  jobParameters)  {                 Log.d("brycegao",  "onStopJob  alive");                 return  false;         } }

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







                                                            我的微信公众号, 欢迎关注, 让我们一起成长
Android5.0以上app进程保活的正确姿势

文章图片


                                                                                                         
Android5.0以上app进程保活的正确姿势

文章图片
           




    推荐阅读