PowerManager
是 Android 系统中用于管理设备电源状态的核心服务,开发者可以通过它控制设备的唤醒、休眠、屏幕亮灭 等行为。以下是对 PowerManager
核心功能接口的详细说明,包含使用场景、注意事项和代码示例。
1. 获取 PowerManager 实例
通过 Context
获取系统服务
java
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
**2. 唤醒锁(WakeLock)**
作用:阻止设备进入休眠状态(如屏幕关闭或 CPU 休眠)。
2.1 创建 WakeLock
通过 newWakeLock()
方法创建:
java
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakeLockTag");
2.2 WakeLock 类型
-
PARTIAL_WAKE_LOCK
保持 CPU 运行,屏幕和键盘背光可能关闭。
场景 :后台音乐播放、网络长连接。
注意 :Android 6.0 (API 23) 及以上,需在代码中动态请求权限(
android.permission.WAKE_LOCK
)。 -
SCREEN_DIM_WAKE_LOCK (已废弃,API 17+)
保持屏幕亮起但可能变暗,CPU 运行。 -
FULL_WAKE_LOCK (已废弃,API 17+)
保持屏幕高亮,CPU 运行。 -
**
ACQUIRE_CAUSES_WAKEUP
** 立即唤醒设备(如用于通知亮屏)。
-
**
ON_AFTER_RELEASE
** 释放 WakeLock 后,保持屏幕亮起一段时间。
2.3 使用 WakeLock
java
wakeLock.acquire(); // 获取 WakeLock
wakeLock.release(); // 释放 WakeLock(必须成对调用)
注意事项:
- 避免长期持有 WakeLock,防止耗电。
- 在
onPause()
或onDestroy()
中确保释放。 - Android 9+ 限制后台应用获取 WakeLock,需结合前台服务使用。
3. 屏幕状态控制
3.1 判断屏幕是否亮起
java
boolean isScreenOn = powerManager.isInteractive();
3.2 强制唤醒屏幕(API 20+)
java
// 需要权限:android.permission.WAKE_LOCK
if (powerManager.isInteractive()) {
return; // 屏幕已亮
}
PowerManager.WakeLock screenWakeLock = powerManager.newWakeLock(
PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
"MyApp::ScreenWakeLock");
screenWakeLock.acquire(500); // 自动在 500ms 后释放
4. 省电模式适配
4.1 判断省电模式是否开启
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
boolean isPowerSaveMode = powerManager.isPowerSaveMode();
}
4.2 监听省电模式变化
java
IntentFilter filter = new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean isPowerSaveMode = powerManager.isPowerSaveMode();
// 更新应用逻辑
}
}, filter);
5. 设备休眠控制
5.1 用户活动检测
触发用户活动以推迟休眠:
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
powerManager.userActivity(SystemClock.uptimeMillis(),
PowerManager.USER_ACTIVITY_EVENT_OTHER);
}
5.2 强制设备进入休眠(仅系统应用)
需要系统签名权限:
java
powerManager.goToSleep(SystemClock.uptimeMillis());
6. 低电耗模式(Doze)和白名单
- Doze 模式:Android 6.0+ 在设备静止时限制网络和 CPU。
- 白名单:允许应用在 Doze 模式下执行任务。
6.1 判断是否在白名单中
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
boolean isIgnoringBatteryOptimizations = powerManager.isIgnoringBatteryOptimizations(
context.getPackageName());
}
6.2 请求加入白名单
引导用户手动开启:
java
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
典型使用场景
- 媒体播放 :使用
PARTIAL_WAKE_LOCK
保持后台播放。 - 即时通信:通过 WakeLock 维持长连接。
- 定时任务:结合白名单和 Doze 模式优化。
总结
PowerManager
是控制设备电源状态的关键工具,但需谨慎使用以避免过度耗电。开发者需关注 API 版本差异、权限管理和系统限制,结合前台服务、省电模式适配和用户引导,实现高效且合规的电源管理。