網站首頁 編程語言 正文
概況
ConnectivityManager主要職責,官方說明:
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
監控網絡連接(Wi-Fi, GPRS, UMTS, etc.);
當網絡連接改變時發送Intent;
當連接到一個網絡失敗時,嘗試用其他網絡補救;
提供API給應用查詢有效網絡粗略或者精確的狀態;
提供API給應用為它們的數據傳輸請求和選擇網絡;
ConnectivityManager類用于查詢網絡狀態,并且也能被動監聽網絡狀態的變化。
需要的權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
判斷是否有網絡
下面這個getActiveNetworkInfo 方法是過時的舊方法。這里記錄一下,請注意如果獲取到的是null,那么等于當前設備沒有連接網絡。注意這里是使用kotlin代碼調用的。
private fun hasNetwork(): Boolean {
val connectivity = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivity.activeNetworkInfo
return networkInfo != null && networkInfo.isAvailable // networkInfo如果是null也是沒有網絡
}
新方法請使用getActiveNetwork,同上如果獲取到的是null,那么等于當前設備沒有連接網絡
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代表沒有網絡
}
return false
}
判斷當前網絡類型
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 網絡")
} else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){
Log.e("ytzn", "item wifi 移動網絡")
}
}
監聽網絡狀態
如果你的需求只是關注是否有網絡,你只需要關心 onAvailable回調(有網絡時回調) 與 onLost回調(無網絡時回調)
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) // 表示此網絡使用Wi-Fi傳輸
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)// 表示此網絡使用蜂窩傳輸
.build();
connectivity.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
// 網絡可用
ToastUtils.showShortToast("網絡可用");
Log.e("調試_臨時_log", "this_onAvailable");
}
@Override
public void onUnavailable() {
super.onUnavailable();
// 如果在指定的超時時間內未找到網絡,則調用
Log.e("調試_臨時_log", "this_onUnavailable");
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
// 當框架的網絡嚴重中斷或正常故障結束時調用
Log.e("調試_臨時_log", "this_onLost");
}
@Override
public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
super.onBlockedStatusChanged(network, blocked);
// 當對指定網絡的訪問被阻止或取消阻止時調用
Log.e("調試_臨時_log", "this_onBlockedStatusChanged");
}
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
// 當網絡連接到此請求的框架*更改功能但仍滿足規定的需求時調用。
boolean isInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);// 獲取是否能連接Internet網
Log.e("調試_臨時_log", "this_onCapabilitiesChanged : isInternet = " + isInternet);
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
// 當網絡即將斷開時調用。通常與新替換網絡的呼叫配對,
// 以實現優雅的切換。如果我們有嚴重損失*(損失而沒有警告),則可能無法調用此方法。
Log.e("調試_臨時_log", "this_onLosing");
}
@Override
public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
// 當與該請求連接的框架網絡更改時調用。
Log.e("調試_臨時_log", "this_onLinkPropertiesChanged");
}
});
}
另外你可以在配置的時候addTransportType指定監聽某個網絡狀態比如WiFi或者移動網絡,NetworkCapabilities類里還有更多類型:
/**
* 表示此網絡使用移動蜂窩傳輸。
*/
public static final int TRANSPORT_CELLULAR = 0;
/**
*表示此網絡使用Wi-Fi傳輸。
*/
public static final int TRANSPORT_WIFI = 1;
/**
* 表示此網絡使用藍牙傳輸
*/
public static final int TRANSPORT_BLUETOOTH = 2;
/**
* 表示此網絡使用以太網傳輸。
*/
public static final int TRANSPORT_ETHERNET = 3;
/**
* 指示此網絡使用VPN傳輸。
*/
public static final int TRANSPORT_VPN = 4;
/**
* 表示此網絡使用支持 Wi-Fi Aware 的傳輸。
*/
public static final int TRANSPORT_WIFI_AWARE = 5;
/**
* 表示此網絡使用低功耗傳輸。
*/
public static final int TRANSPORT_LOWPAN = 6;
原文鏈接:https://codingce.blog.csdn.net/article/details/127419863
相關推薦
- 2022-08-02 Docker安裝Redis配置遠程連接及踩坑_docker
- 2022-11-08 Fluentd搭建日志收集服務_服務器其它
- 2022-10-01 如何在Python中對文件進行操作_python
- 2022-09-30 LeetCode189輪轉數組python示例_python
- 2022-09-28 Python變量定義的簡單使用介紹_python
- 2022-07-14 android?viewflipper實現左右滑動切換顯示圖片_Android
- 2024-03-13 QAobject修改excel字體亂碼問題
- 2023-01-28 C#實現自定義單選和復選按鈕樣式_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支