最近在做Q的升级项目,写了一个悬浮框的demo,在设置界面 悬浮框竟然消失了,离开设置界面又出现了。我觉得很奇怪,百度一下,没有找到相关,我决定看一下。
android Q Settings 中 src/com/android/settings/core/HideNonSystemOverlayMixin.java
@OnLifecycleEvent(ON_START)
public void onStart() {
if (mActivity ==null || !isEnabled()) {
return;
}
mActivity.getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
android.util.EventLog.writeEvent(0x534e4554, "120484087", -1, "");
}
@OnLifecycleEvent(ON_STOP)
public void onStop() {
if (mActivity ==null || !isEnabled()) {
return;
}
final Window window = mActivity.getWindow();
final WindowManager.LayoutParams attrs = window.getAttributes();
attrs.privateFlags &= ~SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
window.setAttributes(attrs);
}
使用它的代码在src/com/android/settings/core/SettingsBaseActivity.java
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final long startTime = System.currentTimeMillis();
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
......
}
所有 继承 SettingsBaseActivity 的类会 hide 悬浮框。
再来了解一下 SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
core/java/android/view/WindowManager.java
/**
* Flag to indicate that any window added by an application process that is of type
* {@link #TYPE_TOAST} or that requires
* {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when
* this window is visible.
* @hide
*/
@SystemApi
@RequiresPermission(permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS)
public static final int SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS =0x00080000;
我比较了android P 发现 android P 中 不是用的SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
而是用的PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
设置该属性需要HIDE_NON_SYSTEM_OVERLAY_WINDOWS 权限。接下来,看下系统怎么声明该权限的
core/res/AndroidManifest.xml
{@link android.view.WindowManager.LayoutsParams#SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS}
to hide non-system-overlay windows.
Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"
android:protectionLevel="signature|installer" />
hide non-system-overlay windows. :表示可以隐藏非系统的 OVERLAY_WINDOWS。
android:protectionLevel="signature|installer" 一般app 是不可以 申请的。
我做了下面实验;
在system App 中 写 悬浮框的效果,在其他页面设置SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS,发现悬浮框并不能隐藏。
该属性只能隐藏第三方 app 显示 的 悬浮框。
网友评论