前言
最近又在重新看《第一行代碼》這本書包蓝,在第五章中有一個(gè)樣例,可以檢測(cè)當(dāng)前網(wǎng)絡(luò)狀態(tài),但是只能判斷當(dāng)前網(wǎng)絡(luò)是否可用,在此之上我想是否能做出一個(gè)和我們?nèi)粘J褂玫腁PP一樣判斷當(dāng)前網(wǎng)絡(luò)是wifi還是移動(dòng)網(wǎng)絡(luò)的樣例出來矫限,于是便有了這篇博文的誕生,同樣這也是我第一次寫博文,希望能夠給需要的人帶來一些啟發(fā)叼风。
檢測(cè)網(wǎng)絡(luò)變化
- 首先在清單文件里加入權(quán)限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
這里我們加入的這個(gè)權(quán)限并非<uses-permission android:name="android.permission.INTERNET" />
因?yàn)槲覀冎恍枰獞?yīng)用去獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)幸斥,而不需要去通過應(yīng)用去上網(wǎng),所以只加入上述一個(gè)權(quán)限即可咬扇。 - 實(shí)現(xiàn)書上的樣例
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "網(wǎng)絡(luò)狀態(tài)改變", Toast.LENGTH_SHORT).show();
}
}
由于代碼比較少,直接在MainActivity里寫一個(gè)內(nèi)部類廊勃,讓它繼承自BroadcastReceiver懈贺,命名為NetworkChangeReceive,并重寫onReceive方法坡垫,當(dāng)檢測(cè)到網(wǎng)絡(luò)狀態(tài)變化時(shí)彈出一個(gè)Toast梭灿。
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
在全局變量中增加兩個(gè)變量。
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方法里對(duì)networkChangeReceiver進(jìn)行注冊(cè)并且在onDestroy方法里進(jìn)行注銷冰悠。
現(xiàn)在讓我們運(yùn)行程序堡妒,可以發(fā)現(xiàn)程序已經(jīng)能夠判斷網(wǎng)絡(luò)狀態(tài)的變化,但是這還是不夠的溉卓,所以接下來讓我們接著進(jìn)行改進(jìn)皮迟。
檢測(cè)當(dāng)前網(wǎng)絡(luò)是否可用
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, "當(dāng)前網(wǎng)絡(luò)可用", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "當(dāng)前網(wǎng)絡(luò)不可用", Toast.LENGTH_SHORT).show();
}
}
在onReceive()方法中,首先通過getSystemService()方法得到了ConnectivityManager的實(shí)例桑寨,這是一個(gè)系統(tǒng)服務(wù)類伏尼,專門用于管理網(wǎng)絡(luò)連接的。然后調(diào)用它的getActiveNetworkInfo()方法可以得到NetworkInfo的實(shí)例尉尾,接著調(diào)用NetworkInfo的isAvailable()方法就可以判斷出當(dāng)前是否有網(wǎng)絡(luò)了爆阶。
再次運(yùn)行程序,發(fā)現(xiàn)已經(jīng)可以判斷當(dāng)前網(wǎng)絡(luò)是否可用沙咏,書上的例子到這里也就結(jié)束了辨图,不過之后我們只需要對(duì)當(dāng)前網(wǎng)絡(luò)的類型進(jìn)行判斷就可以完成我們最終的目標(biāo)了。
判斷當(dāng)前網(wǎng)絡(luò)屬于wif還是流量
通過查看API肢藐,找到networkInfo中的getType方法可以返回當(dāng)前網(wǎng)絡(luò)類型故河。一共有五種類型,而其中的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網(wǎng)絡(luò)", Toast.LENGTH_SHORT).show();
break;
case TYPE_WIFI:
Toast.makeText(context, "正在使用wifi上網(wǎng)", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
} else {
Toast.makeText(context, "當(dāng)前無網(wǎng)絡(luò)連接", Toast.LENGTH_SHORT).show();
}
}
}
}
嘗試修改代碼忧勿,運(yùn)行。發(fā)現(xiàn)程序?qū)崿F(xiàn)了我們想要的功能瞻讽,至此你已經(jīng)實(shí)現(xiàn)了判斷當(dāng)前網(wǎng)絡(luò)類型的功能鸳吸。