Android WifiLock 和 WakeLock

WifiLock

Android 对 WiFi 电源管理的代码主要在 WifiService.java 中。如果应用程序想在屏幕被关掉后继续使用 WiFi 则可以调用 acquireWifiLock 来锁住 WiFi,该操作会阻止 WiFi 进入睡眠状态。当应用程序不再使用 WiFi 时需要调用 releaseWifiLock 来释放 WiFi。之后WiFi可以进入睡眠状态以节省电源。

默认情况下当屏幕被关掉以后,如果没有应用程序在使用 WiFi,WiFi 会在2分钟后进入睡眠状态。这主要是为防止频繁地改变 WiFi 的电源模式。

private static void acquireWifiLock(Context ctx) {
    if (sWifiLock == null) {
        WifiManager wMgr = (WifiManager) ctx.getSystemService(WIFI_SERVICE);
        sWifiLock = wMgr.createWifiLock("ThisService#WifiLock");
    }
    sWifiLock.acquire();
}

private static void releaseWifiLock() {
    if (sWifiLock != null) {
        sWifiLock.release();
    }
}

WakeLock

WakeLock 是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠。可以被用户态程序和内核获得。锁分为有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了,内核就会启动休眠的那套机制来进入休眠。

创建了 PowerManager.WakeLock 有两种机制,第一种是不计数锁机制,另一种是计数锁机制。可以通过 setReferenceCounted(boolean value) 来指定,一般默认为计数机制。

区别在于:
1)前者无论 acquire() 了多少次,只要通过一次 release() 即可解锁。
2)后者真正解锁是在 (–count == 0) 的时候,同样当 (count == 0) 的时候才会去申请加锁,其他情况 isHeld 状态是不会改变的。

所以 PowerManager.WakeLock 的计数机制并不是正真意义上的对每次请求进行申请/释放每一把锁,它只是对同一把锁被申请/释放的次数进行了统计再正真意义上的去操作。

private static void acquireWakeLock(Context ctx) {
    if (sWakeLock == null) {
        PowerManager pMgr = (PowerManager) ctx.getSystemService(POWER_SERVICE);
        sWakeLock = pMgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ThisService#wakelock.");
    }
    sWakeLock.acquire();
}

private static void releaseWakeLock() {
    if (sWakeLock != null) {
        sWakeLock.release();
    }
}

你可能感兴趣的:(Android)