FLAG_KEEP_SCREEN_ON反向工作

时间:2016-01-26 08:17:10

标签: android android-layout android-layoutparams

这是一个奇怪的。

我之前使用过:      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方法中。我担心我不知道这是否相关或如何确保addFlagsclearFlags在正确的线程中运行(如果相关)。

[编辑:This question解释了如何在UI线程上运行并且已经摆脱了“仅原始线程”错误。]

为什么它有时会工作(我不能说错误是否会在日志显示时显示,因为我只是在测试远离我的电脑时才看到它有效)?

2 个答案:

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