如何搭配PowerManager.LOCATION_MODE_NO_CHANGE参数使用WakeLock?
崩溃原因
你传入的LOCATION_MODE_NO_CHANGE不是PowerManager.newWakeLock()方法支持的合法参数,这个常量归属于LocationManager定位服务,仅用于控制设备定位模式的切换逻辑,和电源锁的功能完全无关。
当你向newWakeLock()方法传入不匹配的flag常量时,系统会直接抛出IllegalArgumentException异常,这就是你应用崩溃的直接原因。
电源锁合法参数说明
PowerManager类仅支持以下几种电源锁flag:
PARTIAL_WAKE_LOCK:仅保持CPU处于运行状态,屏幕和键盘背光均可关闭,是你当前场景下正确的选型FULL_WAKE_LOCK:保持屏幕、键盘背光、CPU全量运行,该参数已在API 17版本废弃,若需要保持屏幕常亮推荐使用WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON参数实现SCREEN_DIM_WAKE_LOCK:保持CPU运行,允许屏幕亮度降低至昏暗状态,该参数已在API 17版本废弃SCREEN_BRIGHT_WAKE_LOCK:保持CPU和屏幕高亮运行,键盘背光可关闭,该参数已在API 17版本废弃
额外使用注意事项
- 使用电源锁前需要在
AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.WAKE_LOCK" />,未声明权限会触发SecurityException崩溃 - 电源锁使用完成后必须及时调用
mWakeLock.release()方法释放资源,避免长时间占用CPU导致设备异常耗电 - 非必要场景不建议长期持有电源锁,后台定时任务类需求优先使用WorkManager、JobScheduler等系统调度组件实现,功耗控制更优
内容的提问来源于stack exchange,提问作者Faizan Ahmad
相关产品推荐
相关产品推荐

