ตรวจสอบสถานะ 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_ACTIONBroadcast ไม่ได้ส่งไปยา 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 Level | Recommended Approach |
|---|---|
| < 21 | BroadcastReceiver (CONNECTIVITY_ACTION) |
| 21 - 23 | NetworkCallback (Preferred) หรือ BroadcastReceiver |
| 24+ | NetworkCallback (Required for Background) |
| All (Modern) | WorkManager + NetworkConstraints |