Android ConnectivityManager網(wǎng)絡(luò)管理詳解
概況
ConnectivityManager主要職責(zé),官方說(shuō)明:
Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)
Send broadcast intents when network connectivity changes
Attempt to “fail over” to another network when connectivity to a network is lost
Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks
Provide an API that allows applications to request and select networks for their data traffic
監(jiān)控網(wǎng)絡(luò)連接(Wi-Fi, GPRS, UMTS, etc.);
當(dāng)網(wǎng)絡(luò)連接改變時(shí)發(fā)送Intent;
當(dāng)連接到一個(gè)網(wǎng)絡(luò)失敗時(shí),嘗試用其他網(wǎng)絡(luò)補(bǔ)救;
提供API給應(yīng)用查詢有效網(wǎng)絡(luò)粗略或者精確的狀態(tài);
提供API給應(yīng)用為它們的數(shù)據(jù)傳輸請(qǐng)求和選擇網(wǎng)絡(luò);
ConnectivityManager類用于查詢網(wǎng)絡(luò)狀態(tài),并且也能被動(dòng)監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的變化。
需要的權(quán)限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
判斷是否有網(wǎng)絡(luò)
下面這個(gè)getActiveNetworkInfo 方法是過(guò)時(shí)的舊方法。這里記錄一下,請(qǐng)注意如果獲取到的是null,那么等于當(dāng)前設(shè)備沒(méi)有連接網(wǎng)絡(luò)。注意這里是使用kotlin代碼調(diào)用的。
private fun hasNetwork(): Boolean {
val connectivity = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivity.activeNetworkInfo
return networkInfo != null && networkInfo.isAvailable // networkInfo如果是null也是沒(méi)有網(wǎng)絡(luò)
}
新方法請(qǐng)使用getActiveNetwork,同上如果獲取到的是null,那么等于當(dāng)前設(shè)備沒(méi)有連接網(wǎng)絡(luò)
private fun hasNetwork2(): Boolean {
var connectivityManager: ConnectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
val network = connectivityManager.activeNetwork
return network != null // 如果是null代表沒(méi)有網(wǎng)絡(luò)
}
return false
}判斷當(dāng)前網(wǎng)絡(luò)類型
val cm = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networks = cm.allNetworks
for (item in networks){
val caps = cm.getNetworkCapabilities(item)
if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
Log.e("ytzn", "item wifi 網(wǎng)絡(luò)")
} else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){
Log.e("ytzn", "item wifi 移動(dòng)網(wǎng)絡(luò)")
}
}
監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)
如果你的需求只是關(guān)注是否有網(wǎng)絡(luò),你只需要關(guān)心 onAvailable回調(diào)(有網(wǎng)絡(luò)時(shí)回調(diào)) 與 onLost回調(diào)(無(wú)網(wǎng)絡(luò)時(shí)回調(diào))
private void networkListener() {
ConnectivityManager connectivity = (ConnectivityManager) getContext().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 表示此網(wǎng)絡(luò)使用Wi-Fi傳輸
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)// 表示此網(wǎng)絡(luò)使用蜂窩傳輸
.build();
connectivity.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
// 網(wǎng)絡(luò)可用
ToastUtils.showShortToast("網(wǎng)絡(luò)可用");
Log.e("調(diào)試_臨時(shí)_log", "this_onAvailable");
}
@Override
public void onUnavailable() {
super.onUnavailable();
// 如果在指定的超時(shí)時(shí)間內(nèi)未找到網(wǎng)絡(luò),則調(diào)用
Log.e("調(diào)試_臨時(shí)_log", "this_onUnavailable");
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
// 當(dāng)框架的網(wǎng)絡(luò)嚴(yán)重中斷或正常故障結(jié)束時(shí)調(diào)用
Log.e("調(diào)試_臨時(shí)_log", "this_onLost");
}
@Override
public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
super.onBlockedStatusChanged(network, blocked);
// 當(dāng)對(duì)指定網(wǎng)絡(luò)的訪問(wèn)被阻止或取消阻止時(shí)調(diào)用
Log.e("調(diào)試_臨時(shí)_log", "this_onBlockedStatusChanged");
}
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
// 當(dāng)網(wǎng)絡(luò)連接到此請(qǐng)求的框架*更改功能但仍滿足規(guī)定的需求時(shí)調(diào)用。
boolean isInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);// 獲取是否能連接Internet網(wǎng)
Log.e("調(diào)試_臨時(shí)_log", "this_onCapabilitiesChanged : isInternet = " + isInternet);
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
// 當(dāng)網(wǎng)絡(luò)即將斷開(kāi)時(shí)調(diào)用。通常與新替換網(wǎng)絡(luò)的呼叫配對(duì),
// 以實(shí)現(xiàn)優(yōu)雅的切換。如果我們有嚴(yán)重?fù)p失*(損失而沒(méi)有警告),則可能無(wú)法調(diào)用此方法。
Log.e("調(diào)試_臨時(shí)_log", "this_onLosing");
}
@Override
public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
// 當(dāng)與該請(qǐng)求連接的框架網(wǎng)絡(luò)更改時(shí)調(diào)用。
Log.e("調(diào)試_臨時(shí)_log", "this_onLinkPropertiesChanged");
}
});
}另外你可以在配置的時(shí)候addTransportType指定監(jiān)聽(tīng)某個(gè)網(wǎng)絡(luò)狀態(tài)比如WiFi或者移動(dòng)網(wǎng)絡(luò),NetworkCapabilities類里還有更多類型:
/**
* 表示此網(wǎng)絡(luò)使用移動(dòng)蜂窩傳輸。
*/
public static final int TRANSPORT_CELLULAR = 0;
/**
*表示此網(wǎng)絡(luò)使用Wi-Fi傳輸。
*/
public static final int TRANSPORT_WIFI = 1;
/**
* 表示此網(wǎng)絡(luò)使用藍(lán)牙傳輸
*/
public static final int TRANSPORT_BLUETOOTH = 2;
/**
* 表示此網(wǎng)絡(luò)使用以太網(wǎng)傳輸。
*/
public static final int TRANSPORT_ETHERNET = 3;
/**
* 指示此網(wǎng)絡(luò)使用VPN傳輸。
*/
public static final int TRANSPORT_VPN = 4;
/**
* 表示此網(wǎng)絡(luò)使用支持 Wi-Fi Aware 的傳輸。
*/
public static final int TRANSPORT_WIFI_AWARE = 5;
/**
* 表示此網(wǎng)絡(luò)使用低功耗傳輸。
*/
public static final int TRANSPORT_LOWPAN = 6;到此這篇關(guān)于Android ConnectivityManager網(wǎng)絡(luò)管理詳解的文章就介紹到這了,更多相關(guān)Android ConnectivityManager內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android中button實(shí)現(xiàn)onclicklistener事件的兩種方式
本文介紹下Android中button實(shí)現(xiàn)onclicklistener事件的兩種方法,感興趣的朋友可以參考下2013-04-04
android開(kāi)發(fā)教程之view組件添加邊框示例
這篇文章主要介紹了android開(kāi)發(fā)中給view組件添加邊框的示例,需要的朋友可以參考下2014-02-02
Android 廣播大全 Intent Action 事件詳解
這篇文章主要給大家介紹Android 廣播大全 Intent Action 事件詳解,涉及到android廣播action 方面知識(shí)點(diǎn),本文講解的非常的全面,感興趣的朋友一起看看吧2015-10-10
Android判斷NavigationBar是否顯示的方法(獲取屏幕真實(shí)的高度)
有些時(shí)候,我們需要知道當(dāng)前手機(jī)上是否顯示了NavigationBar,也就是屏幕底部的虛擬按鍵。這篇文章主要介紹了Android判斷NavigationBar是否顯示的方法(獲取屏幕真實(shí)的高度),需要的朋友可以參考下本文2017-01-01
Flutter中嵌入Android 原生TextView實(shí)例教程
這篇文章主要給大家介紹了關(guān)于Flutter中嵌入Android 原生TextView的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Android編程設(shè)計(jì)模式之迭代器模式詳解
這篇文章主要介紹了Android編程設(shè)計(jì)模式之迭代器模式,結(jié)合實(shí)例形式詳細(xì)分析了Android迭代器模式的概念、原理、應(yīng)用場(chǎng)景、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2017-12-12
Android SeekBar在刷新使用中需要注意的問(wèn)題
SeekBar在刷新使用中需要注意的問(wèn)題:在使用SeekBar的過(guò)程中需要注意刷新頻率,避免頻繁刷新造成的性能問(wèn)題;同時(shí),需要對(duì)SeekBar的監(jiān)聽(tīng)事件進(jìn)行適當(dāng)?shù)膬?yōu)化,減少回調(diào)次數(shù),提高響應(yīng)速度2023-05-05
Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤
這篇文章主要為大家詳細(xì)介紹了Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤,熟練掌握SurfaceVie實(shí)現(xiàn)抽獎(jiǎng)大轉(zhuǎn)盤,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android判斷用戶的網(wǎng)絡(luò)類型實(shí)例講解(2/3/4G、wifi)
這篇文章主要介紹了Android判斷用戶的網(wǎng)絡(luò)類型實(shí)例,用戶的網(wǎng)絡(luò)類型分為2G、3G、4G、wifi,通過(guò)Android如何判斷用戶的網(wǎng)絡(luò)類型,本文為大家揭曉2015-12-12
Android 基于Socket的聊天應(yīng)用實(shí)例(二)
本篇文章主要介紹了Android 基于Socket的聊天應(yīng)用實(shí)例,具有一定的參考價(jià)值,有需要的可以了解一下。2016-12-12

