【问题标题】:Dim screen while user inactive用户不活动时屏幕变暗
【发布时间】:2011-01-26 10:01:35
【问题描述】:

我有一个应用程序可以使用 4 小时,但用户只需每 5 分钟进行一次输入或阅读屏幕。让手机进入睡眠状态并锁定屏幕有点烦人。所以我有两个选择:

  1. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 不锁屏但屏幕一直亮,我想在没有活动时调暗。仅仅因为电池寿命,还是因为这 4 个小时没有那么重要?

  2. 唤醒锁SCREEN_DIM_WAKE_LOCK 这和我想要的一样,但有人告诉我宁愿使用上面的选项 1。

我可以在没有唤醒锁的情况下以某种方式实现目标吗?

【问题讨论】:

    标签: android wakelock


    【解决方案1】:

    你可以使用:

    WindowManager.LayoutParams lp = getWindow().getAttributes();  
    lp.dimAmount=1.0f; 
    getWindow().setAttributes(lp);  
    

    根据需要调暗/取消调暗屏幕。

    lp.dimAmount=1.0f 将使屏幕完全变暗,但您可以根据自己的意愿将其设置为从 0(完全不变暗)到 1.0f 的值。

    您可以设置一个计时器,在 5 分钟不活动后调用它,然后在任何触摸事件或类似事件时“重新打开”屏幕。

    【讨论】:

    • 你在这里指的是什么dialog 对象?从文档看来,该字段只会使您设置它的窗口后面的任何内容变暗。那么您是否建议创建一个虚拟(可能是不可见的)窗口/对话框?
    • Turbo,对话框只是我的代码中的一个实际对话框变量,但您可以直接从要使屏幕变暗的活动中调用它(只需从最后一行删除“对话框。” )..为了清楚起见,我将其编辑出来
    • 我明白了。我对docs 中的措辞感到困惑:“窗口标志:此窗口后面的所有内容都将变暗。” 因此,即使您将其应用于ActivityWindowActivity 仍然会变暗,而不仅仅是它背后的内容?这就是为什么我认为你正在制作一个虚拟的Dialog 来应用它,所以它后面的Activity 会变暗。但我想它也会影响您应用它的Window
    • 嗯,此代码在我的设备上不起作用。在 Android 6.0(Nexus 5X 和三星 S7)和 Android 5.0(Nexus 4)上测试。我测试了 -1、0 和 1 的浮点数,没有任何变化。我能够检索到 1 的 dimAmount。
    【解决方案2】:

    即使是昏暗的屏幕也会在 4 小时内消耗大量电池电量。你真的不想那样保持屏幕亮着。我认为您最好使用 FLAG_SHOW_WHEN_LOCKED,允许屏幕关闭,但让用户在重新打开应用时立即进入您的应用,而无需先通过锁定屏幕。

    如果您确实需要保持屏幕昏暗,可以使用 SCREEN_DIM_WAKE_LOCK。如果你想要更多的控制,你也可以尝试直接使用 WindowManager.LayoutParams.screenBrightness 设置屏幕亮度。

    【讨论】:

    • 不错,但它有一个“有趣的效果”:首先我等到屏幕变黑,然后我点击屏幕,我又回到了我的活动中。到目前为止完美。我按下一个按钮来启动一个新的活动,这会打开锁定屏幕,直到我解锁它,或者如果第二个活动设置了相同的标志,那么只有半秒钟,然后我就进入了第二个活动。也不是我想要的。如果该锁定屏幕在短时间内不会出现,那将是完美的,知道如何实现这一点吗?
    【解决方案3】:

    这是否回答了您从 2011 年 1 月 26 日 15:28 开始的最后一个问题

     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
      wl.acquire();
       ..screen will stay on during this section..
     wl.release();
    

    更多信息请看这里:http://developer.android.com/reference/android/os/PowerManager.html

    所以我的意思是,您应该在启动新活动之前获取电源管理器唤醒锁定以防止屏幕锁定。完成后释放。


    你同样可以使用 lp.screenBrightness 代替 lp.dimAmount

    并确保输入高于 0 的值以避免屏幕锁定:

    lp.screenBrightness = 0.01f + value / 100.0f; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2014-02-19
      相关资源
      最近更新 更多