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

     

     

  • 相关阅读:
    搭建Apache服务器并使用自签证书实现https访问
    常见加密算法
    awk命令用法
    systemd的新特性及常见的systemd unit类型分析
    kickstart文件制作与光盘镜像制作
    grub启动引导程序配置及命令行接口详解
    Linux启动流程(CentOS6)
    Linux相关网络命令
    rpm与yum,at与crontab,sed命令使用
    腾讯明眸极速高清升级2.0,助力韩国赛事超高清5G直播
  • 原文地址:https://www.cnblogs.com/lipeil/p/2614916.html
Copyright © 2020-2023  润新知