手机QQ后台为何清不掉

原理

问题来自于一篇文章:手机QQ后台为何清不掉?MIUI工程师:全靠1像素的页面保命
出于好奇,想知道这一像素到底是啥东西,用手机安全管家控制QQ的悬浮窗权限:
关闭QQ的悬浮窗权限,通过后台一键清理,重新打开QQ,发现是从splash开始的;
打开QQ的悬浮窗权限,一键清理后,打开QQ,发现是直接进入主界面的;说明一键清理未清理QQ,或者清理之后,QQ又自启动了。
至于,是未被清理还是自启动,后面再探究一下,这里就说说这个一像素的悬浮窗。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Button button = new Button(getApplicationContext());
WindowManager wm = (WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();

/**
* 以下都是WindowManager.LayoutParams的相关属性 具体用途请参考SDK文档
*/

wmParams.type = LayoutParams.TYPE_PHONE; // 这里是关键,你也可以试试2003
wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
/**
* 这里的flags也很关键 代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE;
* 40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8)
*/

wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_NOT_TOUCHABLE;
wmParams.width = 1;
wmParams.height = 1;
wm.addView(button, wmParams); // 创建View

添加权限

1
<uses -permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses>

就这么简单添加了一个悬浮窗,不管返回launcher还是打开什么应用,都会一直显示这个button。
QQ的这个悬浮窗是做得比较小,应该还是透明的,还会放在靠边或者角落里,如果通过这个悬浮窗来保证QQ始终在后台进程,带我再探究一下。

ref

转自这里

文章目录
  1. 1. 原理
  2. 2. 代码实现
  3. 3. ref