在 android 中按返回键或主页按钮时是否可以使用 WindowManager 删除覆盖?
Is possible remove an overlay with WindowManager when press back or home button in android?
我试图在网站上找到我的问题的一些答案,但我没有找到任何东西,而且我不确定是否可以在按下返回或主页按钮时使用 windowManager 删除或隐藏叠加层。
这是我现在拥有的。当用户转到我的应用程序的设置屏幕时,我使用覆盖所有屏幕的辅助功能服务放置了一个覆盖层。 WindowManager 显示叠加层,但是当我尝试按下后退按钮或主页按钮时它不起作用。好像被屏蔽了。仅在应用进程停止时才消失覆盖。
请注意,我没有使用 activity 来显示叠加层。我正在使用 accessitibilyService 来完成这项从 AccessibilityService 扩展而来的任务。
我想要做的是在用户按下后退或主页按钮的地方,移除叠加层。
这是我显示叠加层的代码:
private String checkOverlay = "hide"
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
0,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
overlayRunning.setBackgroundColor(Color.parseColor("#1C1C1C"));
wm.addView(overlayRunning, params);
checkOverlay = "show";
我已将此方法添加到 class:
@Override
public boolean onKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Log.e(TAG, "Back button??");
Log.e(TAG, "Back button??");
overlayRunning.setVisibility(View.INVISIBLE);
case KeyEvent.KEYCODE_HOME:
Log.e(TAG, "Home button??");
if(checkOverlay.equals("show")) {
WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
wm.removeViewImmediate(overlayRunning);
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
checkOverlay = "hide";
}
return false;
}
return super.onKeyEvent(event);
}
删除视图很容易。我注意到您已将其设置为不可见,这是一个可以接受的解决方案。您还可以保留对它的引用并执行以下操作:
windowManager.removeView(mYourView);
问题在于检测后退按钮是否按下。你不能可靠地做到这一点。您依赖于硬件预期,即按下后退按钮会发送带有 KEYCODE_BACK 的按键事件,而 OS 不会做出此保证。但是,在我的 Droid turbo 上可以执行以下操作:
首先您需要一个单独的 xml 文件来配置您的无障碍服务。
service_config.xml的内容:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
...
android:canRequestFilterKeyEvents="true"
android:accessibilityFlags="flagDefault|flagRequestFilterKeyEvents"
...
/>
AndroidManifest.xml 的内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<application ...>
<service ...>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/service_config" />
</service>
</application>
</manifest>
只需将 windowmanager 类型设置为 APPLICATION,这样 windowmanager 将仅在应用程序打开时附加视图,而无需覆盖主页或后退按钮,查看文档 here
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
0,
PixelFormat.TRANSLUCENT);
我试图在网站上找到我的问题的一些答案,但我没有找到任何东西,而且我不确定是否可以在按下返回或主页按钮时使用 windowManager 删除或隐藏叠加层。
这是我现在拥有的。当用户转到我的应用程序的设置屏幕时,我使用覆盖所有屏幕的辅助功能服务放置了一个覆盖层。 WindowManager 显示叠加层,但是当我尝试按下后退按钮或主页按钮时它不起作用。好像被屏蔽了。仅在应用进程停止时才消失覆盖。
请注意,我没有使用 activity 来显示叠加层。我正在使用 accessitibilyService 来完成这项从 AccessibilityService 扩展而来的任务。
我想要做的是在用户按下后退或主页按钮的地方,移除叠加层。
这是我显示叠加层的代码:
private String checkOverlay = "hide"
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
0,
PixelFormat.TRANSLUCENT);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
overlayRunning.setBackgroundColor(Color.parseColor("#1C1C1C"));
wm.addView(overlayRunning, params);
checkOverlay = "show";
我已将此方法添加到 class:
@Override
public boolean onKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
Log.e(TAG, "Back button??");
Log.e(TAG, "Back button??");
overlayRunning.setVisibility(View.INVISIBLE);
case KeyEvent.KEYCODE_HOME:
Log.e(TAG, "Home button??");
if(checkOverlay.equals("show")) {
WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
wm.removeViewImmediate(overlayRunning);
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
checkOverlay = "hide";
}
return false;
}
return super.onKeyEvent(event);
}
删除视图很容易。我注意到您已将其设置为不可见,这是一个可以接受的解决方案。您还可以保留对它的引用并执行以下操作:
windowManager.removeView(mYourView);
问题在于检测后退按钮是否按下。你不能可靠地做到这一点。您依赖于硬件预期,即按下后退按钮会发送带有 KEYCODE_BACK 的按键事件,而 OS 不会做出此保证。但是,在我的 Droid turbo 上可以执行以下操作:
首先您需要一个单独的 xml 文件来配置您的无障碍服务。
service_config.xml的内容:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
...
android:canRequestFilterKeyEvents="true"
android:accessibilityFlags="flagDefault|flagRequestFilterKeyEvents"
...
/>
AndroidManifest.xml 的内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<application ...>
<service ...>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/service_config" />
</service>
</application>
</manifest>
只需将 windowmanager 类型设置为 APPLICATION,这样 windowmanager 将仅在应用程序打开时附加视图,而无需覆盖主页或后退按钮,查看文档 here
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
0,
PixelFormat.TRANSLUCENT);