实现添加悬浮窗的核心源码代码WindowManagerService#addWindow方法中有以下几个关键:
1.权限检查
mPolicy.checkAddPermission(attrs, appOp);
2.悬浮窗参数调整
mPolicy.adjustWindowParamsLw(win.mAttrs);
查看不同android版本的源码对比
结论:
android 4.4(api 19)之前使用TYPE_TOAST 可以显示,但是不能接收触摸事件和按键事件
mPolicy实际上是PhoneWindowManager。
对比checkAddPermission()方法变化结论:
android 4.3(api 18) 开始 TYPE_TOAST根本没有做权限检查, 直接break出去了, 最后返回WindowManagerGlobal.ADD_OKAY。这个就是使用TYPE_TOAST不需要权限显示悬浮窗的原因
//android 4.3_r2.1
public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) {
int type = attrs.type;
outAppOp[0] = AppOpsManager.OP_NONE;
if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
|| type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {
return WindowManagerGlobal.ADD_OKAY;
}
Stri