WeakLock可以用于阻止手機休眠, 防止后臺任務由于休眠被打斷; 保持屏幕常亮;
1.用法
<uses-permission android:name="android.permission.WAKE_LOCK" />
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();
if (wakeLock.isHeld()){
wakeLock.release();
}
注意點:
- Wakelock 默認是引用計數,同一 wakelock 調用幾次 acquire(),就需搭配調用幾次 release() 才能真正釋放
- 可以使用
WakeLock.setReferenceCounted(false)
關閉引用計數, 然后多次獲取, 一次 release() - 若 wakelock 已釋放,再調用 release() 就會拋 RuntimeException異常
- 使用
WakeLock.acquire(long timeout)
, 設定獲取的時長, 超時后自動釋放;
2.類型
在powerManager.newWakeLock
時, 可以指定不同的 WakeLock 的類型, 以在不同的情況下使用;
Flag Value | CPU | Screen | Keyboard |
---|---|---|---|
PARTIAL_WAKE_LOCK | On | Off | Off |
SCREEN_DIM_WAKE_LOCK | On | Dim | Off |
SCREEN_BRIGHT_WAKE_LOCK | On | Bright | Off |
FULL_WAKE_LOCK | On | Bright | Bright |
只建議使用
PARTIAL_WAKE_LOCK
, 其他的都已被sdk標注為 deprecated
3.使用場景
- Services 和 Receiver保持鎖屏后運行; Receiver 可以使用系統提供的
WakefulBroadcastReceiver
- Activity保持屏幕常亮, 不建議使用WakeLock, 可以使用其他方式, 如下;
-
在Window中添加保持常亮的 flag
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); }
-
在布局文件中設置
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true" > ... </RelativeLayout>
-
其他
-
查看程序的 WakeLock
adb shell dumpsys power