前言
最近又在重新看《第一行代碼》這本書,在第五章中有一個樣例,可以檢測當前網絡狀態,但是只能判斷當前網絡是否可用,在此之上我想是否能做出一個和我們日常使用的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();
}
}
}
}
嘗試修改代碼,運行。發現程序實現了我們想要的功能,至此你已經實現了判斷當前網絡類型的功能。