这是一个奇怪的。
我之前使用过:
android:keepScreenOn="true"
在我的布局文件中,以保持活动中的屏幕,这很好。
但是我想改进屏幕,以便在网络应用处于特定状态时保持屏幕状态。 (如果用户希望,用户仍然可以关闭屏幕,我实际上只是想禁用超时 - 当活动处于活动状态时,布局文件中的上述内容就会实现。)
要做到这一点,我有一个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方法中。我担心我不知道这是否相关或如何确保addFlags
和clearFlags
在正确的线程中运行(如果相关)。
[编辑:This question解释了如何在UI线程上运行并且已经摆脱了“仅原始线程”错误。]
为什么它有时会工作(我不能说错误是否会在日志显示时显示,因为我只是在测试远离我的电脑时才看到它有效)?
答案 0 :(得分: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);
}
});
答案 1 :(得分:-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);
}