3

这是一个奇怪的问题。

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

在我的布局文件中保持屏幕在活动中,这工作正常。

但是,我想改进,以便仅在 Web 应用程序处于特定状态时才保持屏幕亮起。(如果用户愿意,他们仍然应该能够关闭屏幕,我实际上只是想禁用超时 - 只要活动处于活动状态,布局文件中的上述内容就会实现。)

为此,我在其中添加了一个 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显示正确,但“保持屏幕打开”操作相反。

即当我听到Toast说屏幕将保持在它上面时,它会超时并在几分钟后切换。但是当我得到Toast允许屏幕关闭的说法时,屏幕实际上会一直亮着而不会超时。

我不明白这怎么可能。


好的,情节变厚了。

似乎它可能并不总是操作的逆转,但可能是随机的工作/不工作情况。

此外,查看 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 类中,但不在 onCreate 方法中。恐怕我不知道这是否相关,或者如果相关,如何确保addFlagsandclearFlags在正确的线程中运行。

[编辑:这个问题解释了如何让事情在 UI 线程上运行,并摆脱了“仅原始线程”错误。]

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

4

2 回答 2

0

文本“只有创建视图层次结构的原始线程才能接触其视图”表示您正在从非主线程执行此代码,该线程也称为 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);
        }
    });
于 2016-01-26T21:29:00.240 回答
-1
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);
}
于 2016-01-26T09:38:54.523 回答