Android 界面 是可以设置隐藏其他应用的悬浮框(第三方应用)

最近在做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

-->

            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 显示 的 悬浮框。

你可能感兴趣的:(Android 界面 是可以设置隐藏其他应用的悬浮框(第三方应用))