1、wifilock
Android 對WiFi電源管理的代碼主要在WifiService.java中。如果應用程序想在屏幕被關掉后繼續使用WiFi則可以調用 acquireWifiLock來鎖住WiFi,該操作會阻止WiFi進入睡眠狀態。當應用程序不再使用WiFi時需要調用 releaseWifiLock來釋放WiFi。之后WiFi可以進入睡眠狀態以節省電源。
默認情況下當屏幕被關掉以后,如果沒有應用程序在使用WiFi,WiFi會在2分鍾后進入睡眠狀態。這主要是為防止頻繁地改變WiFi的電源模式。
private void takeWifiLock() { myLog.d("Taking wifi lock"); if (wifiLock == null) { WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifiLock = manager.createWifiLock("SwiFTP"); wifiLock.setReferenceCounted(false); } wifiLock.acquire(); } private void releaseWifiLock() { myLog.d("Releasing wifi lock"); if (wifiLock != null) { wifiLock.release(); wifiLock = null; } }
2、Wake Lock是一種鎖的機制, 只要有人拿着這個鎖,系統就無法進入休眠。可以被用戶態程序和內核獲得. 鎖分為有超時的或者是沒有超時的,超時的鎖會在時間過去以后自動解鎖. 如果沒有鎖了或者超時了, 內核就會啟動休眠的那套機制來進入休眠.
創建了 PowerManager.WakeLock 有兩種機制,第一種是不計數鎖機制,另一種是計數鎖機制。可以通過 setReferenceCounted(boolean value) 來指定,一般默認為計數機制。
區別在於:
1)前者無論 acquire() 了多少次,只要通過一次 release()即可解鎖。
2)后者正真解鎖是在( --count == 0 )的時候,同樣當 (count == 0) 的時候才會去申請加鎖,其他情況 isHeld 狀態是不會改變的。
所以 PowerManager.WakeLock 的計數機制並不是正真意義上的對每次請求進行申請/釋放每一把鎖,它只是對同一把鎖被申請/釋放的次數進行了統計再正真意義上的去操作。
private void takeWakeLock() { if (wakeLock == null) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); if (fullWake) { wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, WAKE_LOCK_TAG); } else { wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKE_LOCK_TAG); } wakeLock.setReferenceCounted(false); } acquire(); } private void releaseWakeLock() { if (wakeLock != null) { wakeLock.release(); wakeLock = null; } else { myLog.i("Couldn't release null wake lock"); } }
