自从换了Nexus 6p后就一直用绿色守护[免费版]做后台服务管理。没事的时候打开绿色守护点点就能杀一遍后台服务,挺管用。
但是渐渐发现大部分应用进程能被都杀死,但是支付宝、QQ等总是不能被自动杀死并提示“界面被开启”,但是实际上并不能找到开启的页面在哪。
image_1apv3cf721ah11auhro918chc6q1f.png-64.8kB感觉被耍流氓啦。赶紧学习下,说不定哪天我们也要耍。
进程优先级
image_1apv3khqm4dertjf1lus1pvu9.png-151kB(从Bugly盗图)
进程优先级如图所示,当系统资源不足时会从下向上开始回收。绿色守护判定未“界面被开启”至少是前台进程(Foreground process)或可见进程(Visible process)。所谓的前台进程只能有一个,是指当前用户正在使用的应用的进程(我在用绿色守护唉,绿色守护就是当前的前台进程)。所以说这类应用是将自己的服务从后台服务优先级为4升级到了可见服务优先级为2。
但是android系统从2.3开始要求你要把一个服务提升为可见服务必须要在通知栏放一条通知。也就是跟QQ音乐似得,可以后台运行,但是必须要显示一个通知让用户感知到。你想运行又不想让用户感知到,那岂不就流氓了。
如何能实现不显示通知的可见服务
无通知的可见服务,算是利用的Android系统的漏洞。当后台服务A转可见服务时,需要绑定一个可见推送N1(ID为1234)。A启动另外一个后台服务B,B转可见服务依旧版定N1(ID为1234),B服务关闭通知N1转为后台服务后服务A依旧为可见服务。
具体代码如下:
public class CustomTestService extends Service {
public static final int NOTIFICATION_ID = 1234;
private static final String TAG = "CustomTestService";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
if (Build.VERSION.SDK_INT < 18) {
//18以前空通知栏即可
startForeground(NOTIFICATION_ID, new Notification());
} else {
Intent innerIntent = new Intent(this, CustomTestInnerService.class);
startService(innerIntent);
startForeground(NOTIFICATION_ID, new Notification());
}
return super.onStartCommand(intent, flags, startId);
}
private static class CustomTestInnerService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startForeground(NOTIFICATION_ID, new Notification());
stopForeground(true);
stopSelf();
return super.onStartCommand(intent, flags, startId);
}
}
}
现在我们的服务也是偷摸升级为可见服务了,优先级提高一截。
image_1apv56d641e3l1cd7ck1aie13r916.png-132.9kB吐槽: Android开发好蛋疼,Android用户更蛋疼。大厂都搞这种流氓保活,小厂一跟风,弄最后优先级不为2的都不能叫服务。最终受害者还是我大天朝群众。从自身做起,愿人间App没有流氓.....
image_1apv5uji7r7tbog1dms1hrph5qm.png-49.7kB
网友评论