FLAG_KEEP_SCREEN_ON 反向工作
FLAG_KEEP_SCREEN_ON working in reverse
这很奇怪。
我之前使用的是:
android:keepScreenOn="true"
在我的布局文件中将屏幕保持在 activity 中并且效果很好。
不过,我想改进它,以便仅当网络应用程序处于特定状态时屏幕才会保持打开状态。 (用户仍然可以根据需要关闭屏幕,我实际上只是想禁用超时 - 只要 activity 处于活动状态,布局文件中的上述内容就会实现。)
为此,我有一个 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
,但是"keep screen on"的动作是相反的。
即当我收到 Toast
说屏幕将保持打开时,它超时并在几分钟后切换。但是当我得到 Toast
说屏幕将被允许关闭时,屏幕实际上保持打开状态而不会超时。
我不明白这是怎么回事。
好吧,剧情变厚了。
看来不一定是操作的反转,可能是随机的work/not工作情况。
此外,查看 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 class 中,但不在 onCreate 方法中。恐怕我不知道这是否相关或如何确保 addFlags
和 clearFlags
在正确的线程中 运行 如果相关的话。
[编辑:This question 解释了如何在 UI 线程上获取 运行ning 并消除了 'Only the original thread' 错误。]
为什么它有时会起作用(我不能说错误是否在它起作用时出现在日志中,因为我只在离开我的 PC 进行测试时才看到它起作用)?
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);
}
文本 "Only the original thread that created a view hierarchy can touch its views" 表示您正在从 non-main 线程执行此代码,该线程也称为 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);
}
});
这很奇怪。
我之前使用的是:
android:keepScreenOn="true"
在我的布局文件中将屏幕保持在 activity 中并且效果很好。
不过,我想改进它,以便仅当网络应用程序处于特定状态时屏幕才会保持打开状态。 (用户仍然可以根据需要关闭屏幕,我实际上只是想禁用超时 - 只要 activity 处于活动状态,布局文件中的上述内容就会实现。)
为此,我有一个 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
,但是"keep screen on"的动作是相反的。
即当我收到 Toast
说屏幕将保持打开时,它超时并在几分钟后切换。但是当我得到 Toast
说屏幕将被允许关闭时,屏幕实际上保持打开状态而不会超时。
我不明白这是怎么回事。
好吧,剧情变厚了。
看来不一定是操作的反转,可能是随机的work/not工作情况。
此外,查看 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 class 中,但不在 onCreate 方法中。恐怕我不知道这是否相关或如何确保 addFlags
和 clearFlags
在正确的线程中 运行 如果相关的话。
[编辑:This question 解释了如何在 UI 线程上获取 运行ning 并消除了 'Only the original thread' 错误。]
为什么它有时会起作用(我不能说错误是否在它起作用时出现在日志中,因为我只在离开我的 PC 进行测试时才看到它起作用)?
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);
}
文本 "Only the original thread that created a view hierarchy can touch its views" 表示您正在从 non-main 线程执行此代码,该线程也称为 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);
}
});