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);
}
});