WeakLock 筆記

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.使用場景

  1. Services 和 Receiver保持鎖屏后運行; Receiver 可以使用系統提供的 WakefulBroadcastReceiver
  2. 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>
      

其他

  1. 查看程序的 WakeLock

     adb shell dumpsys power
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容