Android Wifi锁之WifiLock

今天看公司项目时,发现WIFI居然有 锁,之前未了解过这个,特意搜索了一下,发现挺实用的,在此总结一下

有的时候我们需要app在手机后台运行,但是会遇到手机一旦息屏或者断网,app无法正常运行的情况,android锁屏后wifi不活跃的解决方案



1. 今天在看MediaPlayer-API Guides-Media Playback使用说明的时候,内容如下:
原文地址: http://developer.android.com/guide/topics/media/mediaplayer.html#viacontentresolver
2. 大概的意思是 :然而,在本实施例中获取的唤醒锁保证只有CPU保持清醒。如果你是流媒体在网络上,并且您使用Wi-Fi,你还有获取一个WifiLock,你必须获得和手动释放。所以,当你开始准备的MediaPlayer与远程URL,你应该创建并获得了Wi-Fi锁。


3. 于是查找资料,搞清楚为什么要设置Wifi锁?


来自: http://blog.csdn.net/zidan_2011/article/details/7779398


手机屏幕关闭之后,并且其他的应用程序没有在使用wifi的时候,系统大概在两分钟之后,会关闭wifi,使得wifi处于睡眠状态。


目的:有利于电源能量的节省和延长电池寿命等


4. WifiManager.WifiLock使用场景:通过WifiLock来锁定wifi网络,使其一直保持连接,直到这个锁定被释放。如果app需要下载很大的文件,就需要保持wifi锁,来确保app有足够的时间下载完成。wifi锁不能超越wifi-enabled设置,也没有飞行模式


5. google官方定义


http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
Allows an application to keep the Wi-Fi radio awake.Normally the Wi-Fi radio may turn off when the user has not used the device in a while. Acquiring a WifiLock will keep the radio on until the lock is released. Multiple applications may hold WifiLocks, and the radio will only be allowed to turn off when no WifiLocks are held in any application.


允许应用程序保持Wi-Fi唤醒状态。通常情况下, Wi-Fi网络可以关闭,当用户没有使用该设备在一段时间。获取WifiLock将保持网络,直到锁被释放。多个应用程序可持有WifiLocks ,而收音机将只能被允许关闭时,没有WifiLocks在任何应用程序举行。


6. 使用方法


package com.example.demo;


import android.content.Context;
import android.net.wifi.WifiManager;


/**
 * WifiLock的锁
 * Created by Administrator on 2015/8/5.
 */
public class WifiLocKManager {
    // 定义WifiManager对象
    private WifiManager mWifiManager;


    // 定义一个WifiLock
    private WifiManager.WifiLock mWifiLock;
    private Context context;


    public WifiLocKManager(Context context) {
        // 取得WifiManager对象
        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        //第一种方式
        creatWifiLock("WifiLocKManager");
        //第二种方式
        //注意,在create wifilock的时候,一定要注意传WifiManager.WIFI_MODE_FULL_HIGH_PERF,否则的话在有些手机上貌似不起作用。不过估计对手机性能有所损耗
//        creatWifiLock("WifiLocKManager", WifiManager.WIFI_MODE_FULL_HIGH_PERF);
    }


    /**
     * 创建一个WifiLock
     *
     * @param locakName 名称
     * @param lockType
     *                  WIFI_MODE_FULL == 1

     *                  扫描,自动的尝试去连接一个曾经配置过的点

     *                  WIFI_MODE_SCAN_ONLY == 2

     *                  只剩下扫描

     *                  WIFI_MODE_FULL_HIGH_PERF = 3

     *                  在第一种模式的基础上,保持最佳性能

     */
    public void creatWifiLock(String locakName, int lockType) {
        mWifiLock = mWifiManager.createWifiLock(lockType, locakName);
    }


    /**
     * 创建一个WifiLock
     *
     * @param locakName 名称
     */
    public void creatWifiLock(String locakName) {
        mWifiLock = mWifiManager.createWifiLock(locakName);
    }


    /**
     * 锁定WifiLock
     */
    public void acquireWifiLock() {
        mWifiLock.acquire();
    }


    /**
     * 解锁WifiLock
     */
    public void releaseWifiLock() {
        // 判断时候锁定
        if (mWifiLock.isHeld()) {
            mWifiLock.release();
        }
    }


}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
注意:添加权限


Any application using a WifiLock must request the android.permission.WAKE_LOCK permission in an element of the application’s manifest.


在manifest中添加下面的权限


你可能感兴趣的:(android)