【Android 電量優化】電量優化 ( 網絡狀態獲取 | 主動獲取 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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章