【问题标题】:Android: Wakelock & handling orientation changeAndroid:唤醒锁和处理方向变化
【发布时间】:2010-01-13 17:13:30
【问题描述】:

我在我的应用程序中使用唤醒锁来防止手机在应用程序可见时休眠。

当方向发生变化并且系统在横向模式下销毁并重新创建应用程序时,就会出现问题。如果唤醒锁定时器在后台超时,系统会以释放唤醒锁为契机关闭屏幕。

编辑:我应该提到我正在设置 Wakelock onResume,并释放 onPause - 据我了解,有必要释放然后以防止应用程序泄漏唤醒锁。

我需要唤醒锁来继续改变方向。

下面我概述了一个解决方案。这是处理它的首选方式吗?是否有其他选择?


创建一个持有唤醒锁(而不是活动)的服务,当活动解除绑定时,服务会启动一个倒数计时器(例如 10 秒),如果活动没有重新绑定,它会在计时器到期时释放唤醒锁。如果是简单的方向更改,则 Activity 将在 10 秒内重新绑定并保持唤醒锁,如果没有,唤醒锁将被释放。

谢谢。

【问题讨论】:

    标签: android service android-activity orientation


    【解决方案1】:

    不要使用WakeLock,而是使用WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 标志尝试getWindow().setFlags()

    如果唤醒锁定时器在 系统采用的背景 以释放唤醒锁为契机 关闭屏幕。

    不应该。根据定义,用户已经与设备进行了交互,因此屏幕应该保持亮着,与其他任何东西无关。

    【讨论】:

    • 感谢您的回复。我会考虑尝试你的建议。 -- 除了您在此处引用的内容外,Wakelock 在所有方面都按预期工作。任何想法为什么会发生这种情况?
    • 设置 KEEP_SCREEN_ON 标志是一个更好的解决方案,解决了我的方向改变问题。谢谢。
    • 标志名称是 FLAG_KEEP_SCREEN_ON,而不是 KEEP_SCREEN_ON。
    • @Andrzej Duś:抱歉打错了——我会修正答案。
    • 另一个小的——setFlags 有两个参数:int flags,int mask。
    【解决方案2】:

    我是这样做的……

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");
    

    接着……

    wl.acquire();
    

    ...当您需要实际激活唤醒锁时。

    “PowerManager.ON_AFTER_RELEASE”标志会触发用户活动计时器,因此当此唤醒锁被释放时屏幕会停留更长时间,当您的活动因方向改变而被破坏时就是这种情况。

    对我来说没问题!

    【讨论】:

      【解决方案3】:

      我实际上从未释放唤醒锁来做到这一点。相反,我通过超时获取它。

      private PowerManager.WakeLock wl;
      
      protected void onStart(Bundle savedInstanceState) {
          PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
          wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Words counter");
          // disable reference counting, as acquire/release calls are not paired
          wl.setReferenceCounted(false);
          wl.acquire();
      }
      
      protected void onStop() {
          // acquire for few seconds to keep lock until onStart is called with new orietnation
          wl.acquire(3000);
      }
      

      相对于其他方法的优势:

      • 可用于SCREEN_DIM_WAKE_LOCK
      • 简单(无需使用 isFinishing() 等)
      • 方向更改后不戳用户活动。 IE。调暗的显示屏保持调暗
      • 如果您释放(例如,时间结束但用户仍在活动中),它会立即释放。无需等待默认超时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 2020-01-14
        相关资源
        最近更新 更多