Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีตรวจสอบการเชื่อมต่ออินเทอร์เน็ตบน Android

ตรวจสอบสถานะ Internet Connection บน Android ด้วย BroadcastReceiver

ใช้ ConnectivityManager และ BroadcastReceiver ฟังการเปลี่ยนแปลง Network State แบบ Real-time

ขั้นตอนที่ 1: สร้างโปรเจกต์ Android Studio

File → New Project → Empty Activity

ขั้นตอนที่ 2: เพิ่ม Permission ใน AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

ขั้นตอนที่ 3: สร้าง NetworkUtil Class

public class NetworkUtil {
    public static String getConnectivityStatusString(Context context) {
        ConnectivityManager cm = (ConnectivityManager) 
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        
        if (activeNetwork != null) {
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                return "WiFi enabled";
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                return "Mobile data enabled";
            }
        }
        return "No internet connection";
    }
}

ขั้นตอนที่ 4: สร้าง BroadcastReceiver

public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String status = NetworkUtil.getConnectivityStatusString(context);
        Toast.makeText(context, status, Toast.LENGTH_LONG).show();
        
        // หรือส่ง Event ไปยัง Activity/Fragment ผ่าน EventBus, LiveData, RxJava
    }
}

ขั้นตอนที่ 5: Register/Unregister ใน Activity

public class MainActivity extends AppCompatActivity {
    private NetworkChangeReceiver receiver;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        receiver = new NetworkChangeReceiver();
        // UI Button to trigger check (optional)
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        filter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
        registerReceiver(receiver, filter);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }
}

ขั้นตอนที่ 6: Manifest Declaration (Alternative)

<receiver android:name=".NetworkChangeReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
</receiver>

⚠️ Important: Android 7.0+ (API 24+) Changes

  • CONNECTIVITY_ACTION Broadcast ไม่ได้ส่งไปยา Manifest-declared Receivers แล้ว
  • ต้องใช้ Runtime Registration (registerReceiver ใน onResume) เท่านั้น
  • หรือใช้ JobScheduler / WorkManager สำหรับ Background Network Monitoring

Modern Approach: ConnectivityManager.NetworkCallback (API 21+)

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .build();

cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        // Internet Available
    }
    
    @Override
    public void onLost(Network network) {
        // Internet Lost
    }
});

// Unregister ใน onDestroy:
cm.unregisterNetworkCallback(callback);

สรุป

API LevelRecommended Approach
< 21BroadcastReceiver (CONNECTIVITY_ACTION)
21 - 23NetworkCallback (Preferred) หรือ BroadcastReceiver
24+NetworkCallback (Required for Background)
All (Modern)WorkManager + NetworkConstraints
No