Android - 不进入待机模式关闭屏幕

13

我知道这个问题已经被问了很多次,但从未得到令人满意的答案。

我的问题如下:

我有一个活动,它可以在预定的时间内防止屏幕关闭。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

当预设时间结束时,我会显示一个带倒计时的对话框来提醒用户,如果他不按“取消”,则显示器将在10秒内关闭。

我成功地关闭了显示器,但手机总是进入待机模式。

为了关闭,我使用了:

Window mywindow = getWindow();

WindowManager.LayoutParams lp = mywindow.getAttributes();

lp.screenBrightness = 0.0f;

mywindow.setAttributes(lp);

有没有可能完全变暗显示屏而不进入待机模式(该模式会暂停活动)。

我的目标是,用户只需轻触显示屏即可再次使屏幕变亮。 因此,活动必须保持活动状态。

类似的问题已经在这里提出过。

由于这个问题已经快一年了,我希望也许有人在这段时间内解决了这个问题。

诚挚的问候,

Siggy


你尝试过 PowerManager 吗?它可能会帮助你打开和关闭屏幕。虽然我担心它可能会禁用你的活动接收触摸事件。 - S.D.
1
除了可能性之外,我不确定这是否是一个好主意去实现。当屏幕关闭时,用户期望它处于待机状态。这意味着没有其他进程正在运行,可能会耗尽电池寿命。但也意味着设备已锁定,需要填写PIN码或其他内容才能解锁。你不应该害怕“暂停”应用程序。实际上,考虑到Android活动生命周期,它将被“停止”。例如,打开对话框时是暂停的,而不是设备进入待机状态时。 - Stephan Celis
@Singularity 我目前正在尝试使用 PowerManagerWakeLocks,但我还没有实现我想要的精确处理方式。 - Siggy
@StephanCelis 我知道这种实现方式并不是正确的处理方式,但这是我所服务的客户要求的一个功能。如果不可能实现,我必须找到另一种解决方案来满足需求。 - Siggy
你可能想要查看这个解决方案 - skubo
2个回答

8

似乎无法仅通过触摸屏幕来关闭屏幕并重新激活。

我的新方法如下:

private WakeLock screenWakeLock;

PowerManager pm = PowerManager.getSystemService(Context.POWER_SERVICE);
screenWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                "screenWakeLock");
screenWakeLock.acquire();

PARTIAL_WAKE_LOCK可以让CPU保持运行,但允许显示关闭。

当按下电源或主页按钮时,显示器会再次打开,并且活动会再次变得可见(无需“滑动解锁”或其他操作)。

不要忘记释放screenWakeLock

在我的情况下,我在活动的onResume()中完成了这个操作:

if (screenWakeLock != null) {
   if(screenWakeLock.isHeld())
      screenWakeLock.release();
   screenWakeLock = null;
}

也许这可以帮助将来遇到类似问题的人。

1
+1 但请注意,唤醒锁已在API 13中被弃用(如果您指定的minSDK小于13,则仍然可以在更高版本中使用它)。 - ripopenid
在API的新版本中,您必须更像这样使用它:PowerManager pm = (PowerManager) getBaseContext().getSystemService(Context.POWER_SERVICE); - forresthopkinsa

2

注意:我无法使用WAKELOCK。

我找到了一个解决方法,涉及更改SCREEN_OFF_TIMEOUT。使用以下代码来实现它。

Settings.System.putInt(getContentResolver(), 
                           Settings.System.SCREEN_OFF_TIMEOUT, 10);

这将在全局范围内设置屏幕超时为10毫秒。

现在你可能会因此而受到系统范围的变化而感到困扰。为了解决这个问题,你可以获取默认的屏幕超时时间并将其保存到一个变量中,然后在活动的finish()方法中将系统的SCREEN_OFF_TIMEOUT设置回去。

在设置我们的屏幕超时为10ms之前,获取SCREEN_OFF_TIMEOUT信息。

int defaultScreenTimeout= android.provider.Settings.
      System.getInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,-1);

现在,当您完成更改或活动结束时,您可以将 SCREEN_OFF_TIMEOUT 设置回来。

@Override
public void finish(){
    Settings.System.putInt(getContentResolver(), 
                      Settings.System.SCREEN_OFF_TIMEOUT, defaultScreenTimeout);
super.finish();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接