【Android 电量优化】电量优化 ( 网络状态获取 | 主动获取 WIFI 状态 | 被动获取 WIFI 状态 )

举报
韩曙亮 发表于 2022/01/10 23:56:25 2022/01/10
【摘要】 文章目录 一、获取 WIFI 状态二、主动获取 WIFI 状态三、被动获取 WIFI 状态 参考 Google 官方文档 : 优化电池续航时间 一、获取 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);

  
 
  • 1
  • 2
  • 3

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

NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

  
 
  • 1

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

networkInfo.isConnected()

  
 
  • 1

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

networkInfo.getType() == ConnectivityManager.TYPE_WIFI

  
 
  • 1


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;
    }
}


  
 
  • 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




三、被动获取 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 停用");
        }
    }
}

  
 
  • 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


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
  • 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

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/107150374

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。