在上一篇文章Android即時(shí)網(wǎng)絡(luò)監(jiān)聽(一)-BroadcastReceiver中,我們介紹了使用BroadcaastReceiver進(jìn)行網(wǎng)絡(luò)連接變化監(jiān)聽圾浅,雖然廣播使用方便,但隨著安卓的版本迭代,在權(quán)限上越來越謹(jǐn)慎盼樟,以及為了用戶體驗(yàn)上的優(yōu)化,廣播就顯得有點(diǎn)Low锈至,所以我們本片晨缴,哦不,本文的主角就登場了:ConnectivityManager.NetworkCallback峡捡,關(guān)于它的具體描述击碗,詳見官方文檔,下面我們來看一下具體使用们拙。
1男摧、新建NetworkCallbackImpl類繼承ConnectivityManager.NetworkCallback刑棵,并重寫onAvailable漆际、onLost志于、onCapabilitiesChanged三個(gè)方法:
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.d(TAG, "onAvailable: 網(wǎng)絡(luò)已連接");
}
@Override
public void onLost(Network network) {
super.onLost(network);
Log.e(TAG, "onLost: 網(wǎng)絡(luò)已斷開");
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
Log.d(TAG, "onCapabilitiesChanged: 網(wǎng)絡(luò)類型為wifi");
post(NetType.WIFI);
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
Log.d(TAG, "onCapabilitiesChanged: 蜂窩網(wǎng)絡(luò)");
post(NetType.CMWAP);
} else {
Log.d(TAG, "onCapabilitiesChanged: 其他網(wǎng)絡(luò)");
post(NetType.AUTO);
}
}
}
2、注冊(cè)NetworkCallbackImpl:
NetworkCallbackImpl networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
ConnectivityManager connMgr = (ConnectivityManager) NetworkListener.getInstance().getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr != null) {
connMgr.registerNetworkCallback(request, networkCallback);
}
做完以上兩步之后装盯,運(yùn)行代碼坷虑,不出意外的話,網(wǎng)絡(luò)狀態(tài)改變就可以正常檢測出來了埂奈,其余使用方法由于上一篇文章已經(jīng)寫明迄损,本文就不再贅述,需要的童鞋可參考上一篇文章账磺。
PS:本文為某平臺(tái)公開課筆記芹敌,在此記錄下共屈,文中實(shí)現(xiàn)還可以再次進(jìn)行優(yōu)化。
代碼詳見Demo
另附上一篇文章鏈接Android即時(shí)網(wǎng)絡(luò)監(jiān)聽(一)-BroadcastReceiver