测试 keepScreenOn 属性

Test for keepScreenOn attribute

鉴于我有一个简单的 Android activity 和以下视图代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:ignore="MergeRootFrame"
             android:keepScreenOn="true">

     <!-- more views -->

</FrameLayout>

然后:

我如何测试此 activity 是否会保持屏幕打开并防止平板电脑进入睡眠状态?

旁注:

如果我像这样在 Activity (onCreate) 中设置 FLAG_KEEP_SCREEN_ON 标志:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

然后我可以像这样通过 Robolectric 轻松阅读它:

public static int getWindowFlags(final Activity activity) throws Exception {
    Class clazz = Class.forName(Window.class.getName());
    Method m = clazz.getMethod("getForcedWindowFlags");

    m.setAccessible(true);

    return (int) m.invoke(activity.getWindow());
}

但是,当视图层次结构中的单个视图定义标志时,不会设置标志。

我是否需要迭代所有视图,只是为了找到一个定义它的视图?

我搜索了 Robolectric 这个标志的来源,但没有找到任何东西。我已经为它创建了 issue

您已经找到解决方法 - 以编程方式设置它,在这种情况下您可以对其进行测试。并且你可以不用反射来测试它:

assertThat( shadowWindow.getFlag( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ), is( true ) );