黑色保活
利用不同app进程使用的广播唤醒
- 开机、网络切换、拍照的系统广播
- 第三方SDK的广播
- 应用间的广播,BAT全家桶
灰色保活
- 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);
}
}
}
查看是否有app使用这种方式,在adb shell下dumpsys activity services PackageName
,是否有isForeground=true但是通知栏没有通知的情况
白色保活
启动一个前台service,会在系统通知栏中显示
AccountManager
参考https://juejin.im/entry/574076f52e958a0069101458
oom_adj
什么是oom_adj?它是linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于oom_adj的作用,你只需要记住以下几点即可:
- 进程的oom_adj越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收
- 普通app进程的oom_adj>=0,系统进程的oom_adj才可能<0
查看oom_adj
cat /proc/进程ID/oom_adj