FLAG_KEEP_SCREEN_ON 反向工作

FLAG_KEEP_SCREEN_ON working in reverse

这很奇怪。

我之前使用的是: android:keepScreenOn="true"

在我的布局文件中将屏幕保持在 activity 中并且效果很好。

不过,我想改进它,以便仅当网络应用程序处于特定状态时屏幕才会保持打开状态。 (用户仍然可以根据需要关闭屏幕,我实际上只是想禁用超时 - 只要 activity 处于活动状态,布局文件中的上述内容就会实现。)

为此,我有一个 JavaScript 接口添加到 WebView 中,它包含以下两种方法。

我已经注释掉了布局中的 keepScreenOn 设置。

@JavascriptInterface
public void keepScreenOn(){
    Toast.makeText(mContext, "Keeping screen on", Toast.LENGTH_LONG).show();
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@JavascriptInterface
public void allowScreenOff(){
    Toast.makeText(mContext, "Allowing screen off", Toast.LENGTH_LONG).show();
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

现在显示的是正确的Toast,但是"keep screen on"的动作是相反的。

即当我收到 Toast 说屏幕将保持打开时,它超时并在几分钟后切换。但是当我得到 Toast 说屏幕将被允许关闭时,屏幕实际上保持打开状态而不会超时。

我不明白这是怎么回事。


好吧,剧情变厚了。

看来不一定是操作的反转,可能是随机的work/not工作情况。

此外,查看 Android Studio 中的日志,我收到一条错误消息:

01-26 20:22:51.358 2182-5629/com.nooriginalthought.bluebadgeparking E/ViewRootImpl: com.nooriginalthought.bluebadgeparking.websiteViewActivity : Only the original thread that created a view hierarchy can touch its views.

调用方法时。

但有时确实有效。

上面显示的方法在 websiteViewActivity class 中,但不在 onCreate 方法中。恐怕我不知道这是否相关或如何确保 addFlagsclearFlags 在正确的线程中 运行 如果相关的话。

[编辑:This question 解释了如何在 UI 线程上获取 运行ning 并消除了 'Only the original thread' 错误。]

为什么它有时会起作用(我不能说错误是否在它起作用时出现在日志中,因为我只在离开我的 PC 进行测试时才看到它起作用)?

private Window wind;

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

  //your code

    wind = this.getWindow();
    wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    wind.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

文本 "Only the original thread that created a view hierarchy can touch its views" 表示您正在从 non-main 线程执行此代码,该线程也称为 UI 线程。

WebView 通常在后台线程中执行 javascript,这就是您收到此错误的原因。

尝试使用 "runOnUiThread()"

runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(mContext, "Keeping screen on", Toast.LENGTH_LONG).show();
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }
    });