Android进程保活
网上关于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爱吃葱花