检查屏幕是否处于没有 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");
        }
    }
}