java - 从另一个线程以编程方式关闭 Android 手机中的屏幕

标签 java android multithreading lockscreen wakelock

我正在尝试关闭 Android 手机的屏幕。

我阅读了许多其他讨论,并尝试了此处描述的两种方法: Turn off screen on Android

事实上,我真正需要做的是启动锁定屏幕(要求输入 PIN 码的屏幕)。我不确定如何做到这一点,也找不到相关文档,因此我尝试关闭屏幕,并希望当我重新打开手机时它会显示锁定屏幕。不幸的是,我无法验证我的理论。

第一个选项:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");    
wl.acquire();    
wl.release();

第二个选项:

WindowManager.LayoutParams params = getWindow().getAttributes();   
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON;    
params.screenBrightness = 0;    
getWindow().setAttributes(params);   

第一个选项没有执行任何操作,第二个选项导致我的应用程序崩溃。在堆栈调用中,我看到了一条可疑的日志: 只有创建 View 层次结构的原始线程才能触摸其 View 。我确实从在后台运行的另一个线程(而不是主线程)调用此代码。
这有可能导致崩溃吗?我该如何克服这个问题?
是否有另一种方法可以以编程方式启动锁定屏幕,而无需关闭屏幕?

最佳答案

在第一个选项中,还添加 ACQUIRE_CAUSES_WAKEUP。这将唤醒屏幕并显示锁定屏幕。

PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Your Tag");    

希望这有帮助。

关于java - 从另一个线程以编程方式关闭 Android 手机中的屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986759/

相关文章:

java - 当我们在 Eclips 中单击 "Run on Server"选项时,tomcat 在浏览器中打开主页(Ex :Index. jsp)的步骤是什么

java - 示例程序参数

android - 以下模块已从 Gradle 结构中删除

java - 在java中实时将IO Process的值传递给另一个类

c++ - 委托(delegate)和线程 : CallbackContext parameter

multithreading - 长线程上的 Perl 更新 UI

java - 基于某些业务逻辑在运行时显示/隐藏 Swing 组件的良好设计模式

java - struts2如何设置UTF-8字符编码

php - 使用 Android 发布变量

java - 进度对话框未显示