Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách theo dõi trạng thái kết nối mạng trong Android

Giới thiệu

Bài viết này hướng dẫn kiểm tra trạng thái kết nối mạng (Wi-Fi, Mobile Data, Không kết nối) khi người dùng nhấn nút, sử dụng ConnectivityManager và NetworkInfo. Hiển thị kết quả qua ImageView và TextView.

Các bước thực hiện

Bước 1: Tạo dự án mới

Mở Android Studio, chọn File → New Project và tạo dự án. Chuẩn bị 3 drawable: ic_wifi, ic_mobiledata, ic_dnd (do not disturb/không kết nối).

Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/ivConStatus"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_centerInParent="true"
        android:layout_marginTop="24dp"
        android:scaleType="fitCenter"
        android:contentDescription="Trạng thái mạng" />

    <TextView
        android:id="@+id/tvConStatus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/ivConStatus"
        android:padding="4dp"
        android:textSize="24sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btnCheckNetwork"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="32dp"
        android:text="Kiểm tra mạng" />

</RelativeLayout>

Bước 3: Viết code logic (src/MainActivity.java)

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    ImageView ivConStatus;
    TextView tvConStatus;
    Button btnCheckNetwork;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ivConStatus = findViewById(R.id.ivConStatus);
        tvConStatus = findViewById(R.id.tvConStatus);
        btnCheckNetwork = findViewById(R.id.btnCheckNetwork);

        btnCheckNetwork.setOnClickListener(v -> checkNetworkConnectionStatus());
    }

    private void checkNetworkConnectionStatus() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

        if (activeNetwork != null && activeNetwork.isConnected()) {
            boolean isWifi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
            boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;

            if (isWifi) {
                ivConStatus.setImageResource(R.drawable.ic_wifi);
                tvConStatus.setText("Wi-Fi đang kết nối");
            } else if (isMobile) {
                ivConStatus.setImageResource(R.drawable.ic_mobiledata);
                tvConStatus.setText("Dữ liệu di động đang kết nối");
            } else {
                ivConStatus.setImageResource(R.drawable.ic_dnd);
                tvConStatus.setText("Loại kết nối khác: " + activeNetwork.getTypeName());
            }
        } else {
            ivConStatus.setImageResource(R.drawable.ic_dnd);
            tvConStatus.setText("Không có kết nối mạng");
        }
    }
}

Bước 4: Cấu hình quyền trong AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Thử bật/tắt Wi-Fi, Mobile Data, chế độ máy bay -> nhấn "Kiểm tra mạng" -> ImageView và TextView cập nhật trạng thái.

⚠️ Lưu ý quan trọng: NetworkInfo đã DEPRECATED (API 29+)

Từ Android 10 (API 29), NetworkInfo và getActiveNetworkInfo() bị deprecated. Cách hiện đại dùng NetworkCapabilities và ConnectivityManager.NetworkCallback:

Cách hiện đại (API 21+):

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

cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        NetworkCapabilities nc = cm.getNetworkCapabilities(network);
        if (nc != null) {
            if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                // Wi-Fi
            } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                // Mobile data
            } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
                // Ethernet
            }
        }
    }

    @Override
    public void onLost(@NonNull Network network) {
        // Mất kết nối
    }
});

// Hủy đăng ký khi không cần nữa (trong onDestroy)
cm.unregisterNetworkCallback(this);

So sánh 2 cách

Đặc điểmNetworkInfo (Cũ)NetworkCallback (Mới)
API hỗ trợTất cả (deprecated API 29)API 21+
Kiểm tra một lầnDễ dàngPhức tạp hơn
Lắng nghe realtimeKhông (cần BroadcastReceiver)Có (tự động callback)
Chi tiết khả năng mạngHạn chếRất chi tiết (VPN, validated, metered...)

BroadcastReceiver cho thay đổi mạng (Cũ nhưng vẫn dùng)

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

Lưu ý: Android 7.0+ hạn chế broadcast này, không nhận được khi app ở background.