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

 

 

原文地址:https://www.cnblogs.com/lipeil/p/2614916.html