Android 标记\u保持\u屏幕\u反向工作

Android 标记\u保持\u屏幕\u反向工作,android,android-layout,android-layoutparams,Android,Android Layout,Android Layoutparams,这是一个奇怪的问题 我以前使用过: android:keepScreenOn=“true” 在我的布局文件中,在活动中保持屏幕打开,这很好 但是,我想改进屏幕,这样只有当web应用程序处于特定状态时,屏幕才会保持打开状态。(如果用户愿意,他们应该仍然能够关闭屏幕,我实际上只是想禁用超时——只要活动处于活动状态,上面的布局文件就会实现超时。) 为此,我在WebView中添加了一个JavaScript接口,它包含以下两种方法 我已经注释掉了布局中的keepScreenOn设置 @Javascript

这是一个奇怪的问题

我以前使用过:
android:keepScreenOn=“true”

在我的布局文件中,在活动中保持屏幕打开,这很好

但是,我想改进屏幕,这样只有当web应用程序处于特定状态时,屏幕才会保持打开状态。(如果用户愿意,他们应该仍然能够关闭屏幕,我实际上只是想禁用超时——只要活动处于活动状态,上面的布局文件就会实现超时。)

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

我已经注释掉了布局中的
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
,但“保持屏幕打开”操作相反

i、 e.当我听到
吐司
说屏幕将保持打开时,它会超时并在几分钟后切换。但是当我听到
吐司
说屏幕可以关闭时,屏幕实际上一直保持打开状态,没有超时

我不明白这是怎么回事


好吧,情节变厚了

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

另外,在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方法中。恐怕我不知道这是否相关,也不知道如何确保
addFlags
clearFlags
在相关的正确线程中运行

[编辑:说明如何在UI线程上运行,并已消除“仅原始线程”错误。]

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

文本“只有创建视图层次结构的原始线程才能接触到它的视图”表示您是从非主线程执行此代码,这也称为UI线程

WebView通常在后台线程中执行javascript,因此会出现此错误

尝试使用“runOnUiThread()”

文本“只有创建视图层次结构的原始线程才能接触其视图”表示您正在从非主线程(也称为UI线程)执行此代码

WebView通常在后台线程中执行javascript,因此会出现此错误

尝试使用“runOnUiThread()”


我想这不是我想要的。我相信上面的代码会唤醒手机并显示活动。我所希望的是,当Web应用处于特定状态时,屏幕保持打开(即,在超时后不变暗或关闭),用户仍然可以根据自己的意愿关闭屏幕。对于这一点,我相信我只需要
FLAG\u KEEP\u SCREEN\u ON
,但它似乎起到了相反的作用。我不认为这是我想要的。我相信上面的代码会唤醒手机并显示活动。我所希望的是,当Web应用处于特定状态时,屏幕保持打开(即,在超时后不变暗或关闭),用户仍然可以根据自己的意愿关闭屏幕。为此,我相信我只需要
FLAG\u KEEP\u SCREEN\u ON
,但它的工作方式似乎正好相反。谢谢GeNia。这正是我在编辑中发现的。这是一个非常简单的修复程序,用于将内容转移到UI线程中。我必须仔细阅读这篇文章的含义,但在将来遇到类似问题时,我会牢记这一点。谢谢GeNia。这正是我在编辑中发现的。这是一个非常简单的修复程序,用于将内容转移到UI线程中。我必须仔细阅读这一点的含义,但在将来遇到类似问题时,我会记住这一点。我目前正在编辑的文章中测试runOnUIthread修复程序,以查看这是否解决了原始问题(而不仅仅是错误)。到目前为止看起来不错。我的编辑中链接的问题(与GeNia的答案具有相同的解决方案)解决了这个问题。我仍然不知道为什么我看到了这种奇怪的行为,而不是不起作用。我目前正在测试我编辑的帖子中的runOnUIthread修复程序,看看这是否解决了最初的问题(不仅仅是错误)。到目前为止看起来不错。我的编辑中链接的问题(与GeNia的答案具有相同的解决方案)解决了这个问题。我仍然不知道为什么我看到了这种奇怪的行为,而不是不工作。
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);
}
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);
        }
    });