ConnectivityManager 是 Android 核心系統服務,需通過 Context.getSystemService() 獲取。在 Activity 中可直接呼叫 getSystemService(),但在普通 Java 類(工具類、Presenter、ViewModel 等)中無法直接調用,必須傳入 Context 對象。
public class NetUtils {
// ❌ 編譯錯誤:無法解析 getSystemService
public static boolean isConnected() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// ...
}
}
public class NetUtils {
// ✅ 接收 Context 參數
public static boolean isConnected(Context context) {
// 建議檢查 context 非空
if (context == null) return false;
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm == null) return false;
// API 29+ 建議使用 NetworkCapabilities
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
return capabilities != null &&
(capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
} else {
// 舊版 API
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
}
}
// 在 Activity/Fragment 中
if (NetUtils.isConnected(this)) { ... }
// 在 ViewModel 中(需傳入 Application Context)
if (NetUtils.isConnected(getApplication())) { ... }
// 在非 UI 線程(傳入 Application Context 避免洩漏)
if (NetUtils.isConnected(MyApplication.getInstance())) { ... }
context.getApplicationContext(),避免持有 Activity 導致記憶體洩漏。AndroidManifest.xml 需添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />。// API 24+ 使用 NetworkCallback
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
// 網絡可用
}
@Override
public void onLost(@NonNull Network network) {
// 網絡斷開
}
});
掌握 Context 傳遞原理,不僅解決 ConnectivityManager 問題,更是 Android 開發中區分「上下文類型與生命週期」的核心功課。