Android 通過注冊廣播,實(shí)時(shí)監(jiān)聽網(wǎng)絡(luò)連接與斷開狀態(tài)的變化

很多時(shí)候我們都需要實(shí)時(shí)監(jiān)聽網(wǎng)絡(luò)狀態(tài),當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化之后立即通知程序進(jìn)行不同的操作。

監(jiān)聽廣播的兩種方式:
(1)在AndroidManifest.xml配置文件中聲明

<receiver android:name=".NetworkConnectChangedReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.wifi.STATE_CHANGE" />
            </intent-filter>
        </receiver>

(2)在代碼中注冊

IntentFilter filter = new IntentFilter();
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(new NetworkConnectChangedReceiver(), filter);

接下來創(chuàng)建實(shí)時(shí)監(jiān)聽網(wǎng)絡(luò)連接與斷開狀態(tài)變化的BroadcastReceiver對(duì)象,我們需要繼承android.content.BroadcastReceiver,并實(shí)現(xiàn)其onReceive方法,下面我們就創(chuàng)建一個(gè)名為NetworkConnectChangedReceiver廣播接收者,看一下具體的實(shí)現(xiàn)代碼,由于代碼寫得很詳細(xì),就不一一解釋了

package com.per.networkconnectdome;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Parcelable;
import android.util.Log;

public class NetworkConnectChangedReceiver extends BroadcastReceiver {
    private String getConnectionType(int type) {
        String connType = "";
        if (type == ConnectivityManager.TYPE_MOBILE) {
            connType = "3G網(wǎng)絡(luò)數(shù)據(jù)";
        } else if (type == ConnectivityManager.TYPE_WIFI) {
            connType = "WIFI網(wǎng)絡(luò)";
        }
        return connType;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {// 監(jiān)聽wifi的打開與關(guān)閉,與wifi的連接無關(guān)
            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
            Log.e("TAG", "wifiState:" + wifiState);
            switch (wifiState) {
                case WifiManager.WIFI_STATE_DISABLED:
                    break;
                case WifiManager.WIFI_STATE_DISABLING:
                    break;
            }
        }
        // 監(jiān)聽wifi的連接狀態(tài)即是否連上了一個(gè)有效無線路由
        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
            Parcelable parcelableExtra = intent
                    .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (null != parcelableExtra) {
                // 獲取聯(lián)網(wǎng)狀態(tài)的NetWorkInfo對(duì)象
                NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
                //獲取的State對(duì)象則代表著連接成功與否等狀態(tài)
                NetworkInfo.State state = networkInfo.getState();
                //判斷網(wǎng)絡(luò)是否已經(jīng)連接
                boolean isConnected = state == NetworkInfo.State.CONNECTED;
                Log.e("TAG", "isConnected:" + isConnected);
                if (isConnected) {
                } else {

                }
            }
        }
        // 監(jiān)聽網(wǎng)絡(luò)連接,包括wifi和移動(dòng)數(shù)據(jù)的打開和關(guān)閉,以及連接上可用的連接都會(huì)接到監(jiān)聽
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            //獲取聯(lián)網(wǎng)狀態(tài)的NetworkInfo對(duì)象
            NetworkInfo info = intent
                    .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (info != null) {
                //如果當(dāng)前的網(wǎng)絡(luò)連接成功并且網(wǎng)絡(luò)連接可用
                if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) {
                    if (info.getType() == ConnectivityManager.TYPE_WIFI
                            || info.getType() == ConnectivityManager.TYPE_MOBILE) {
                        Log.i("TAG", getConnectionType(info.getType()) + "連上");
                    }
                } else {
                    Log.i("TAG", getConnectionType(info.getType()) + "斷開");
                }
            }
        }
    }
}

在onReceive方法里面,我們可以獲取從廣播而來的Intent中的數(shù)據(jù),這包含很多有用的信息,其中
ConnectivityManager : 主要管理和網(wǎng)絡(luò)連接相關(guān)的操作
WifiManager: 管理和wifi相關(guān)的信息
TelephonyManager: 管理和手機(jī)、運(yùn)營商等的相關(guān)信息
NetworkInfo類包含了對(duì)wifi和mobile兩種網(wǎng)絡(luò)模式連接的詳細(xì)描述,通過getState()方法獲取的State對(duì)象,代表著連接成功與否的狀態(tài)。
最后記得添加權(quán)限:

<uses-permission android:name="android.permission.access_wifi_state" />
<uses-permission android:name="android.permission.access_network_state" />
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容