Android 电源管理器唤醒锁

Posted

技术标签:

【中文标题】Android 电源管理器唤醒锁【英文标题】:Android Power Manager Wake Lock 【发布时间】:2013-08-30 09:12:19 【问题描述】:

我有一个正在播放电视流的应用程序,需要一直打开。 我确实在 OnCreate() 中获得了唤醒锁

pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG);
wl.acquire();

然后在 onDestroy() 中释放

if (wl != null) 
    wl.release();
    wl = null;

用户通常通过按返回、主页或电源按钮来最小化应用 然后点击应用程序图标从主屏幕恢复。 我确实在 onPause() 中释放唤醒锁并在 onResume() 中获取。

有时我看到应用程序崩溃或完全从屏幕上消失,我看到了 与唤醒锁相关的日志。

这是控制 定的最佳做法吗?

欢迎提出任何意见。

【问题讨论】:

【参考方案1】:

正如您所说,您确实在onPause() 中释放唤醒锁并在onResume() 中获取。这是一个很好的做法,但除此之外,我建议您也可以在 onUserLeaveHint() 中释放唤醒锁。

onUserLeaveHint()

@Override
protected void onUserLeaveHint() 

try 
     // your code.

     // release the wake lock
     wl.release();

    catch(Exception ex)
     Log.e("Exception in onUserLeaveHint", ex.getMessage);
    
    super.onUserLeaveHint();

【讨论】:

【参考方案2】:

然后在 setContentView 之后的 oncreate 中使用它:

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

应该有帮助。

【讨论】:

我想这解决了旧的 Power Manager 常量现在已被弃用的事实。我的主要观点是处理唤醒锁的最佳实践是什么。当用户按下电源按钮时,框架会释放唤醒锁。我想通过返回或主页按钮最小化应用程序时不会发生这种情况。是吗? 根据经验,这行代码足以为你的activity保存wakelock。只要窗口可见,它就持有锁。无需自己处理生命周期的唤醒锁。【参考方案3】:

除了 silvia_aut 的回答,试试

if (wakelock.isHeld())
       wakelock.release();

【讨论】:

如果你这样做,你的 pm 和 wl 变量可以是本地的。获取您的实例,就像您已经拥有 wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG); 一样,然后看看它是否被保留。 是的,这就是我所做的。谢谢,我很高兴收到反馈。【参考方案4】:

试试这个:

wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");

别忘了权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

【讨论】:

谢谢,但我不能使用 DIM。否则,它与我的解决方案相同。

以上是关于Android 电源管理器唤醒锁的主要内容,如果未能解决你的问题,请参考以下文章

如何修改源码android 实现按键唤醒屏幕

PowerManagerService 电源管理架构初识

在 android 应用程序中访问唤醒锁统计信息

Android:PowerManager类 电源管理

用于电源管理的强化学习

Android 电源管理相关逻辑之PMS