检查屏幕是否处于没有 activity 的 MultiWindowMode
Check if screen is in MultiWindowMode without activity
如果我无法访问 Activity
,有什么方法可以确定屏幕是否被分割? (结构上我不能调用 isInMultiWindowMode
方法。
我看到默认的 Activity#isInMultiWindowMode()
实现是:
public boolean isInMultiWindowMode() {
try {
return ActivityManagerNative.getDefault().isInMultiWindowMode(mToken);
} catch (RemoteException e) {
}
return false;
}
有什么解决方法吗?
您可以使用内部片段
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (((Activity)getContext()).isInMultiWindowMode()){
// ...
}
}
我认为没有 Activity
的唯一方法是使用 AccessibilityService
,它有权获取当前显示的 windows 列表并检查是否有window 类型为 AccessibilityWindowInfo.TYPE_SPLIT_SCREEN_DIVIDER
.
例如,您可以使用以下方法:
private boolean inSplitScreenMode(List<AccessibilityWindowInfo> windows) {
for (AccessibilityWindowInfo window : windows) {
if (window.getType() == AccessibilityWindowInfo.TYPE_SPLIT_SCREEN_DIVIDER) {
return true;
}
}
return false;
}
在收到 window 状态更改的可访问性事件时检查此方法
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if ((event.getEventType() & AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) != 0) {
if (inSplitScreenMode(getWindows()) {
Log.d(TAG, "Split screen mode detected");
} else {
Log.d(TAG, "No split screen");
}
}
}
如果我无法访问 Activity
,有什么方法可以确定屏幕是否被分割? (结构上我不能调用 isInMultiWindowMode
方法。
我看到默认的 Activity#isInMultiWindowMode()
实现是:
public boolean isInMultiWindowMode() {
try {
return ActivityManagerNative.getDefault().isInMultiWindowMode(mToken);
} catch (RemoteException e) {
}
return false;
}
有什么解决方法吗?
您可以使用内部片段
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (((Activity)getContext()).isInMultiWindowMode()){
// ...
}
}
我认为没有 Activity
的唯一方法是使用 AccessibilityService
,它有权获取当前显示的 windows 列表并检查是否有window 类型为 AccessibilityWindowInfo.TYPE_SPLIT_SCREEN_DIVIDER
.
例如,您可以使用以下方法:
private boolean inSplitScreenMode(List<AccessibilityWindowInfo> windows) {
for (AccessibilityWindowInfo window : windows) {
if (window.getType() == AccessibilityWindowInfo.TYPE_SPLIT_SCREEN_DIVIDER) {
return true;
}
}
return false;
}
在收到 window 状态更改的可访问性事件时检查此方法
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if ((event.getEventType() & AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) != 0) {
if (inSplitScreenMode(getWindows()) {
Log.d(TAG, "Split screen mode detected");
} else {
Log.d(TAG, "No split screen");
}
}
}