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

             有图有真相,  亲测锤子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.   创建1个像素的Activity,一直显示在桌面上(就像iOS的小圆球)使自己永远是前台进程( 据说QQ就是这样做的。。。)

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

7. 启动Service并执行setForground, 然后使用MediaPlayer循环播放无声音乐, 从而保证自己是前台进程。 PS:缺点是耗电

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

 

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());
 // Android24版本才有scheduleAsPackage方法, 期待中
//Class clz = Class.forName("android.app.job.JobScheduler");
//Method[] methods = clz.getMethods();
//Method method = clz.getMethod("scheduleAsPackage", JobInfo.class , String.class, Integer.class, String.class);
//Object obj = method.invoke(jobScheduler, builder.build(), "com.brycegao.autostart", "brycegao", "test");


 } 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"/>

 

 

 

2016年10月24日补充,经网友反馈在很多机型上不管用, 是我当时验证的机型太少了, 华为Mate8现在的6.0版本还是能自启的。。。Android N似乎又有一个方法scheduleAsPackage可以监听电池容量, 从注释上看是系统级API,猜测能用在自启功能上。可以用反射的方式调用一下, 目前没机器验证不了, 先mark一下。

 

 

    /**
     *
     * @param job The job to be scheduled.
     * @param packageName The package on behalf of which the job is to be scheduled. This will be
     *                    used to track battery usage and appIdleState.
     * @param userId    User on behalf of whom this job is to be scheduled.
     * @param tag Debugging tag for dumps associated with this job (instead of the service class)
     * @return {@link #RESULT_SUCCESS} or {@link #RESULT_FAILURE}
     * @hide
     */
    @SystemApi
    public abstract int scheduleAsPackage(JobInfo job, String packageName, int userId, String tag);

 

 

 

 

 

 

 

 

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

 

                                                            

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值