常見需求:App 啟動或關鍵操作前檢查網路是否可用。許多開發者嘗試用 InetAddress.getByName().isReachable() 或 ping,但這些方法**不可靠、延遲高、無權限**。正統做法是使用 ConnectivityManager。
public boolean isNetworkAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm == null) return false;
NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
return capabilities != null
&& (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
|| capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
|| capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
}
public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm == null) return false;
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
| 方法 | 含義 | 適用場景 |
|---|---|---|
isConnected() | 已建立連線、可傳輸資料 | 需**立即**發送請求、上傳檔案 |
isConnectedOrConnecting() | 已連線**或**正在連線中 | 啟動時檢查、預載資料、允許短暫等待 |
INTERNET 權限,但仍可能被防火牆/路由器阻擋 ICMP
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build();
cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
// 網路可用
runOnUiThread(() -> Toast.makeText(MainActivity.this, "網路已連線", Toast.LENGTH_SHORT).show());
}
@Override
public void onLost(@NonNull Network network) {
// 網路中斷
runOnUiThread(() -> Toast.makeText(MainActivity.this, "網路已斷開", Toast.LENGTH_SHORT).show());
}
});
// 記得在 onDestroy 取消註冊
// cm.unregisterNetworkCallback(callback);
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
ConnectivityManager 而非 InetAddress/pingNetworkCapabilities,舊版用 NetworkInfoisConnected 與 isConnectedOrConnectingNetworkCallback 監聽變化正確檢查網路狀態,能大幅減少無效請求、提升使用者體驗。