Android WifiLock 和 WakeLock

165人阅读 评论(0) 收藏 举报
分类:

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 wifi锁介绍

     Android 对WiFi电源管理的代码主要在WifiService.java中。如果应用程序想在屏幕被关掉后继续使用WiFi则可以调用 acquireWifiLock来锁住WiFi,...
  • jamin0107
  • jamin0107
  • 2011-05-04 14:37:00
  • 1436

Android Wifi锁之WifiLock

Android Wifi锁之WifiLock有的时候我们需要app在手机后台运行,但是会遇到手机一旦息屏或者断网,app无法正常运行的情况,android锁屏后wifi不活跃的解决方案 1. 今天在看...
  • fenggit
  • fenggit
  • 2015-08-05 13:18:30
  • 5031

android屏幕常亮保持(WakeLock & WifiLock的实现)

在android中,申请WakeLock可以使进程持续执行,即使进入睡眠模式,进程的执行也不间断,而且能保持屏幕常亮。 WifiLock跟WakeLock用法作用与WakeLock相同,不过前者是针...
  • ziyanguang1989
  • ziyanguang1989
  • 2012-11-01 14:33:47
  • 1217

Android中获取和释放WakeLock的方法

private PowerManager.WakeLock sCpuWakeLock;private void acquireCpuWakeLock(Context context) { if...
  • lzh398651363
  • lzh398651363
  • 2016-11-03 10:18:52
  • 1373

Android 使用Wake Lock

为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU。WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态。      ...
  • Q_zhe
  • Q_zhe
  • 2012-01-03 01:30:44
  • 14234

Android查看wakeLock调用情况

Android wakelock分为两层 Linux层和应用层 1. 查看linux 的waklock # cat /sys/power/wake_lock ...
  • u010164190
  • u010164190
  • 2017-03-04 12:24:04
  • 1304

Android6.0 wakelock深入分析

这篇博客我们分析下Power的持锁,从PowerManager到PowerManagerService再到hal分析。 一、PowerManager的持锁接口 我们先来看下PowerManager对应...
  • kc58236582
  • kc58236582
  • 2016-06-02 14:30:21
  • 4849

Android WakeLock使用方法

在某些情况下,一些应用程序用户即使长时间不与其交互,也要组织进入休眠状态。一个例子就是我们在看视频时,手机屏幕要保持开启状态。Android为此设计了WakeLock类。     创建和使用Wak...
  • goodlixueyong
  • goodlixueyong
  • 2015-09-04 09:50:40
  • 4886

Android电源管理之三:PowerManager.WakeLock源码详读

PowerManager.WakeLock 有加锁和解锁两种状态,加锁的方式有两种,一种是永久的锁住,这样的锁除非显式的放开,是不会解锁的,所以这种锁用起来要非常的小心。第二种锁是超时锁,这种锁会在锁...
  • zhandoushi1982
  • zhandoushi1982
  • 2013-01-17 14:06:50
  • 9136

Android7.0 PowerManagerService(2) WakeLock的使用及流程

PowerManagerService中WakeLock的用法和基本流程
  • Gaugamela
  • Gaugamela
  • 2016-10-17 14:24:46
  • 5229
    个人资料
    持之以恒
    等级:
    访问量: 2584
    积分: 342
    排名: 23万+
    文章分类
    文章存档
    最新评论