一步步帶你實現Android網路狀態監聽

weixin_33797791發表於2018-03-09

前言

最近又在重新看《第一行程式碼》這本書,在第五章中有一個樣例,可以檢測當前網路狀態,但是隻能判斷當前網路是否可用,在此之上我想是否能做出一個和我們日常使用的APP一樣判斷當前網路是wifi還是行動網路的樣例出來,於是便有了這篇博文的誕生,同樣這也是我第一次寫博文,希望能夠給需要的人帶來一些啟發。

檢測網路變化

  • 首先在清單檔案里加入許可權 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 這裡我們加入的這個許可權並非<uses-permission android:name="android.permission.INTERNET" /> 因為我們只需要應用去獲取當前網路狀態,而不需要去通過應用去上網,所以只加入上述一個許可權即可。
  • 實現書上的樣例
    class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "網路狀態改變", Toast.LENGTH_SHORT).show();
        }
    }
複製程式碼

由於程式碼比較少,直接在MainActivity裡寫一個內部類,讓它繼承自BroadcastReceiver,命名為NetworkChangeReceive,並重寫onReceive方法,當檢測到網路狀態變化時彈出一個Toast。

private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
複製程式碼

在全域性變數中增加兩個變數。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }
複製程式碼

在onCreate方法裡對networkChangeReceiver進行註冊並且在onDestroy方法裡進行登出。

現在讓我們執行程式,可以發現程式已經能夠判斷網路狀態的變化,但是這還是不夠的,所以接下來讓我們接著進行改進。

檢測當前網路是否可用

        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "當前網路可用", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "當前網路不可用", Toast.LENGTH_SHORT).show();
            }
        }
複製程式碼

在onReceive()方法中,首先通過getSystemService()方法得到了ConnectivityManager的例項,這是一個系統服務類,專門用於管理網路連線的。然後呼叫它的getActiveNetworkInfo()方法可以得到NetworkInfo的例項,接著呼叫NetworkInfo的isAvailable()方法就可以判斷出當前是否有網路了。

再次執行程式,發現已經可以判斷當前網路是否可用,書上的例子到這裡也就結束了,不過之後我們只需要對當前網路的型別進行判斷就可以完成我們最終的目標了。

判斷當前網路屬於wif還是流量

通過檢視API,找到networkInfo中的getType方法可以返回當前網路型別。一共有五種型別,而其中的TYPE_MOBILE和TYPE_WIFI正是我們所需要的。

class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                switch (networkInfo.getType()) {
                    case TYPE_MOBILE:
                        Toast.makeText(context, "正在使用2G/3G/4G網路", Toast.LENGTH_SHORT).show();
                        break;
                    case TYPE_WIFI:
                        Toast.makeText(context, "正在使用wifi上網", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
            } else {
                Toast.makeText(context, "當前無網路連線", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
複製程式碼

嘗試修改程式碼,執行。發現程式實現了我們想要的功能,至此你已經實現了判斷當前網路型別的功能。

相關文章