Android 網路斷線/連線廣播監聽

這是舊版 Android API(Android 7 與更早版本)的實作方式,透過廣播接收器 + ConnectivityManager + NetworkInfo 來辨識網路連線與斷線。

1. 核心知識點

  1. ConnectivityManager:系統服務類,專門負責管理網路連線狀態。
  2. 權限:需在 AndroidManifest.xml 加入網路狀態權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Code language: HTML, XML (xml)
  1. 原理:網路發生變化時,系統會發送網路廣播。在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 的寫法。

舊方式的缺點

  1. Android 8.0(API26)之後,靜態註冊的網路狀態廣播受到限制,靜態註冊無法接收網路變化廣播,只能動態註冊接收器。
  2. 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 網路斷線/連線廣播監聽

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *