1.通过WakeLock的方式
首先设置唤醒锁的权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DEVICE_POWER"/>
代码示例:
private PowerManager.WakeLock mWakeLock;
private void acquireWakeLock() {
if (mWakeLock == null) {
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, TAG);
}
//建议计数模式设置为true
mWakeLock.setReferenceCounted(false);
mWakeLock.acquire(60 * 1000);
}
private void releaseWakeLock() {
if (mWakeLock.isHeld()) mWakeLock.release();
}`
总结:
- 尽量使用 acquire(long timeout) 设置超时, (也被称作超时锁). 例如网络请求的数据返回时间不确定, 导致本来只需要10s的事情一直等待了1个小时, 这样会使得电量白白浪费了. 设置超时之后, 会自动释放已节省点远.
- 建议计数模式setReferenceCounted()设置为true,这样调用一次 release() 就会释放所有锁。
- 兼容性问题:PowerManager.SCREEN_DIM_WAKE_LOCK模式已经在废弃。
2.通过window的flag属性设置
示例代码:
private void acquireWakeLock(Activity activity) {
if (activity != null && activity.getWindow() != null) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
private void releaseWakeLock(Activity activity) {
if (activity != null && activity.getWindow() != null) {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
`
3.通过设置View的属性
在布局文件里加上
android:keepScreenOn="true"
总结:
- 兼容性:采用window的flag的方式的兼容性更广
Api的友好性:可以手动进行管理屏幕的唤醒与否
综合比较选择window的flag方式。
参考文章:
https://blog.youkuaiyun.com/a57565587/article/details/51669520/
https://www.jianshu.com/p/48ed37738a9e/