這是舊版 Android API(Android 7 與更早版本)的實作方式,透過廣播接收器 +
ConnectivityManager+NetworkInfo來辨識網路連線與斷線。
1. 核心知識點
- ConnectivityManager:系統服務類,專門負責管理網路連線狀態。
- 權限:需在
AndroidManifest.xml加入網路狀態權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Code language: HTML, XML (xml)
- 原理:網路發生變化時,系統會發送網路廣播。在
BroadcastReceiver的onReceive回呼函式中,透過ConnectivityManager取得當前網路資訊,判斷是連線還是斷線。
2. 完整 onReceive 程式碼
public void onReceive(Context context, Intent intent) {
// 取得網路管理系統服務
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// 取得目前作用中的網路資訊(已淘汰API)
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null) {
if (networkInfo.isAvailable()) {
Toast.makeText(context, "網路已連線", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "網路已斷線", Toast.LENGTH_LONG).show();
}
} else {
// networkInfo為null,代表無網路
Toast.makeText(context, "網路已斷線", Toast.LENGTH_LONG).show();
}
}
Code language: JavaScript (javascript)
3. 重要提醒(淘汰問題)
getActiveNetworkInfo()、NetworkInfo 自 Android 10(API29)起已淘汰
新版 Android 建議使用:
ConnectivityManager.NetworkCallback回呼方式監聽網路,不再推薦舊廣播 + NetworkInfo 的寫法。
舊方式的缺點
- Android 8.0(API26)之後,靜態註冊的網路狀態廣播受到限制,靜態註冊無法接收網路變化廣播,只能動態註冊接收器。
NetworkInfo類別已淘汰,在新版系統直接呼叫會出現警告甚至失效。
4. 動態註冊廣播接收器
// 定義廣播接收器
public class NetReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 將上面的網路判斷程式碼寫在此處
}
}
// 在Activity中動態註冊
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
NetReceiver receiver = new NetReceiver();
registerReceiver(receiver, filter);
Code language: PHP (php)
Android 網路斷線/連線廣播監聽
Previous: 範例 – 接收系統廣播
Next: 使用靜態註冊的方式實作開機提示