android 服务wake_lock,Android WakeLock版本坑

今天发现之前用的这个方法val pm = getSystemService(Context.POWER_SERVICE) as PowerManager

pm.newWakeLock(FLAG_KEEP_SCREEN_ON, "KEEP")

在6.0以下的机子会报错,报了如下错误Must specify a valid wake lock level.

去看了源码:public WakeLock newWakeLock(int levelAndFlags, String tag) {

validateWakeLockParameters(levelAndFlags, tag);

return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName());

}

/** @hide */

public static void validateWakeLockParameters(int levelAndFlags, String tag) {

switch (levelAndFlags & WAKE_LOCK_LEVEL_MASK) {

case PARTIAL_WAKE_LOCK:

case SCREEN_DIM_WAKE_LOCK:

case SCREEN_BRIGHT_WAKE_LOCK:

case FULL_WAKE_LOCK:

case PROXIMITY_SCREEN_OFF_WAKE_LOCK:

case DOZE_WAKE_LOCK:

case DRAW_WAKE_LOCK:

break;

default:

throw new IllegalArgumentException("Must specify a valid wake lock level.");

}

if (tag == null) {

throw new IllegalArgumentException("The tag must not be null.");

}

}

然后再看了一下,发现case的这些常量都是废弃的,注释中推荐让我使用文章开头的那个常量/**

* Wake lock level: Ensures that the screen and keyboard backlight are on at

* full brightness.

*

* If the user presses the power button, then the {@link #FULL_WAKE_LOCK} will be

* implicitly released by the system, causing both the screen and the CPU to be turned off.

* Contrast with {@link #PARTIAL_WAKE_LOCK}.

*

*

* @deprecated Most applications should use

* {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead

* of this type of wake lock, as it will be correctly managed by the platform

* as the user moves between applications and doesn't require a special permission.

*/

@Deprecated

public static final int FULL_WAKE_LOCK = 0x0000001a;

然后又绕了一圈,最终使用版本判断来解决这个问题val pm = getSystemService(Context.POWER_SERVICE) as PowerManager

mWakeLock = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {

pm.newWakeLock(SCREEN_DIM_WAKE_LOCK, "KEEP")

} else {

pm.newWakeLock(FLAG_KEEP_SCREEN_ON, "KEEP")

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值