WifiLock 和 wakelock


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");
        }
    }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM