文章目录

  • 一、获取 WIFI 状态
  • 二、主动获取 WIFI 状态
  • 三、被动获取 WIFI 状态



参考 Google 官方文档 : 优化电池续航时间





一、获取 WIFI 状态



在应用中执行某些操作 , 如软件云端备份 , 从服务器端获取最新版本号 , 从服务器端缓存最新软件安装包 , 固件版本 , 等操作 , 最好都在 WIFI 状态下执行 , 获取 WIFI 的状态也是两种情况 , 分别是主动获取 WIFI 状态 , 被动获取 WIFI 状态 ;

上述操作 , 也建议在手机上充电的状态下执行 ;





二、主动获取 WIFI 状态



1 . 获取 WIFI 状态 : WIFI 状态可以使用 ConnectivityManager 获取 , 调用 getActiveNetworkInfo 方法获取 NetworkInfo 后 , 先判定当前网络是否连接 , 再判断当前的 网络类型 是否是 ConnectivityManager.TYPE_WIFI ;


① 获取连接管理器 : 调用 Context 上下文的 getSystemService(Context.CONNECTIVITY_SERVICE) 方法 , 跨进程获取 ConnectivityManager 服务 ;

        // 获取连接管理器        ConnectivityManager connectivityManager =                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

② 获取网络信息 : 调用 ConnectivityManager 的 getActiveNetworkInfo 方法 , 获取当前网络信息 , 该操作需要 android.Manifest.permission.ACCESS_NETWORK_STATE 权限 ;

NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

③ 判断当前是否已经连接 : 调用 NetworkInfo 对象的 isConnected 方法 , 可以查看该网络的连接状态 , WIFI , 移动蜂窝网络 等有一种连接 , 就会返回 True ;

networkInfo.isConnected()

④ 判断连接类型 : 调用 NetworkInfo 对象的 getType() 方法 , 可以获取当前的连接状态 , 如果连接状态是 ConnectivityManager.TYPE_WIFI , 就说明当前是 WIFI 网络 ;

networkInfo.getType() == ConnectivityManager.TYPE_WIFI


2 . 代码示例 :

package kim.hsl.bp;import android.content.Context;import android.net.ConnectivityManager;import android.net.NetworkInfo;public class WiflUtils {    /**     * 主动获取当前是否正在使用 WIFI     * @return     */    public static boolean isWifi(Context context){        boolean isWifi = false;        // 获取连接管理器        ConnectivityManager connectivityManager =                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        // 获取网络信息        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();        // 判定是否是 WIFI        if(networkInfo != null && networkInfo.isConnected() &&                networkInfo.getType() == ConnectivityManager.TYPE_WIFI){            isWifi = true;        }        return isWifi;    }}




三、被动获取 WIFI 状态



1 . 广播接收者 : 该广播接收者监听系统的 android.intent.action.CONNECTIVITY_CHANGE 事件 , 当接收到系统发出的广播后 , 就判定一次当前是否是 WIFI 状态 ;

package kim.hsl.bp;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.text.TextUtils;import android.util.Log;/** * 被动获取网络状态 * 网络状态发生变化时 , 系统发出的广播 , 使用广播接受者接收这些广播 */public class WifiReceiver extends BroadcastReceiver {    public static final String TAG = "WifiReceiver";    @Override    public void onReceive(Context context, Intent intent) {        boolean isWifi = WiflUtils.isWifi(context);        if(isWifi){            Log.i(TAG, "WIFI 启用");        }else{            Log.i(TAG, "WIFI 停用");        }    }}


2 . 注册广播接收者与权限 : 在 AndroidManifest.xml 中 , 注册上述广播接收者 , 声明使用到的网络相关权限 ;

  • ACCESS_NETWORK_STATE : 获取运营商信息权限 ;
  • ACCESS_WIFI_STATE : 获取 WIFI 网络信息权限 ;
  • CHANGE_WIFI_STATE : 获取改变 WIFI 状态权限 ;
  • INTERNET : 获取访问网络权限 ;
  • READ_PHONE_STATE : 读取手机状态权限 ;
  • WAKE_LOCK : 后台服务保持唤醒权限 ;
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="kim.hsl.bp">    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">uses-permission>    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE">uses-permission>    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE">uses-permission>    <uses-permission android:name="android.permission.INTERNET">uses-permission>    <uses-permission android:name="android.permission.READ_PHONE_STATE">uses-permission>    <uses-permission android:name="android.permission.WAKE_LOCK" />    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            intent-filter>        activity>        <receiver android:name=".BatteryReceiver" >            <intent-filter>                                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />                                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />            intent-filter>        receiver>        <receiver android:name=".WifiReceiver" >            <intent-filter>                                <action android:name="android.intent.action.CONNECTIVITY_CHANGE" />            intent-filter>        receiver>    application>manifest>

更多相关文章

  1. Android SELinux开发入门指南之正确姿势解决访问data目录权限问
  2. Android中ListView使用- 网络图片的异步加载
  3. [Android Pro] android root权限破解分析
  4. Android 网络框架之Retrofit2使用详解及从源码中解析原理
  5. 轻量级Android6.0动态权限解决方案

随机推荐

  1. (004)CSS选择符(selector)
  2. HTML显示日期时间代码 - [js 特效代码]
  3. 这个html太奇怪了,源码看不到"下一页"字符
  4. 基于html属性为gulp构建过程添加条件
  5. 为什么v-align中的将文本放在图像下面
  6. 您试图显示配置为只允许执行和脚本权限的
  7. 为什么IE7没有正确地将 块复制到剪贴板?
  8. ThinkPHP生成静态页buildHtml方法
  9. HTML哪些是块级元素,哪些是行内元素、
  10. 使用Semantic-UI垂直对齐div