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 电源管理器唤醒锁的主要内容,如果未能解决你的问题,请参考以下文章