Android进程保活

作者: 怡红快绿 | 来源:发表于2018-12-26 16:44 被阅读0次

    网上关于Android进程保活问题的答案,真可谓是五花八门什么方案都有,但是至今为止也没有一个终极的解决方案。作为一名Android搬砖工,我真的很庆幸没有所谓的永久保活的黑科技,因为无论是站在一个普通Android手机使用者的立场,还是以保护Android生态环境为出发点,进程永久保活都不是一个明智的做法,并且是做不到的,这种做法也只会滋生出更多的流氓软件。让Android系统运行起来更加流畅,保护Android生态环境,才是所有Android开发人员共同努力的方向。

    **************************这是一条废话与正文的分割线**************************

    关于进程保活,目前业界主要保活方式分为黑、白、灰三种。

    黑色保活

    黑色保活,就是不同的App之间,利用广播来进行相互唤醒。

    场景1:开机,网络切换、拍照、拍视频时候,利用系统产生的广播唤醒app
    谷歌baba在最新的Android N已经取消了 ACTION_NEW_PICTURE(拍照),ACTION_NEW_VIDEO(拍视频),CONNECTIVITY_ACTION(网络切换)等三种广播。而开机广播的话,一些定制ROM的厂商早已经将其去掉。

    场景2:接入第三方SDK也会唤醒相应的app进程,如微信sdk会唤醒微信,支付宝sdk会唤醒支付宝。由此发散开去,就会直接触发了下面的场景3

    场景3:假如你手机里装了支付宝、淘宝、天猫、UC等阿里系的app,那么你打开任意一个阿里系的app后,有可能就顺便把其他阿里系的app给唤醒了。(只是拿阿里打个比方,其实BAT系都差不多)

    没错,我们的Android手机就是一步一步的被上面这些场景给拖卡机的。

    白色保活

    白色保活手段非常简单,就是调用系统api启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个app在运行着,哪怕当前的app退到了后台。很多音乐播放软件貌似就是这样处理的。

    灰色保活

    灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的Service进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到Notification),但你的进程优先级又是高于普通后台进程的。

    思路一:API < 18,启动前台Service时直接传入new Notification();
    思路二:API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理;

    public class GrayService extends Service {
    
        private final static int GRAY_SERVICE_ID = 1001;
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (Build.VERSION.SDK_INT < 18) {
                startForeground(GRAY_SERVICE_ID, new Notification());//API < 18 ,此方法能有效隐藏Notification上的图标
            } else {
                Intent innerIntent = new Intent(this, GrayInnerService.class);
                startService(innerIntent);
                startForeground(GRAY_SERVICE_ID, new Notification());
            }
    
            return super.onStartCommand(intent, flags, startId);
        }
    
        ...
        ...
    
        /**
         * 给 API >= 18 的平台上用的灰色保活手段
         */
        public static class GrayInnerService extends Service {
    
            @Override
            public int onStartCommand(Intent intent, int flags, int startId) {
                startForeground(GRAY_SERVICE_ID, new Notification());
                stopForeground(true);
                stopSelf();
                return super.onStartCommand(intent, flags, startId);
            }
    
        }
    }
    

    代码大致就是这样,能让你神不知鬼不觉的启动着一个前台Service。其实市面上很多app都用着这种灰色保活的手段。
    当某一天 API >= 18 的方案也失效的时候,我们就又要另谋出路了。需要注意的是,使用灰色保活并不代表着你的Service就永生不死了,只能说是提高了进程的优先级。如果你的app进程占用了大量的内存,按照回收进程的策略,同样会干掉你的app。

    PS:想知道更多细节的童鞋可以查看原文,本文只是作为复习资料整理一下。


    原文链接:关于 Android 进程保活,你所需要知道的一切
    作者:D_clock爱吃葱花

    相关文章

      网友评论

        本文标题:Android进程保活

        本文链接:https://www.haomeiwen.com/subject/zrbhlqtx.html