How to detect internet connection change on all Android versions ?

Bài viết này mình không đề cập đến vấn đề gì cao siêu cả, chỉ ghi lại cách thức detect kết nối mạng khi có thay đổi trên android có thể sử dụng ở mọi version từ cũ tới mới.

Step 1: Add permission

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

Step 2: Tạo 1 BroadcastReceiver để lắng nghe kết nối thay đổi (Dành cho android version  <N)

public class ConnectivityReceiver extends BroadcastReceiver {
    private ConnectivityReceiverListener receiverListener;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction()!= null &&  intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")){
            if (receiverListener != null){
                receiverListener.onNetworkConnectionChanged(NetUtils.isConnected(context));
            }
        }
    }

    public void setListener(ConnectivityReceiverListener receiverListener){
        this.receiverListener = receiverListener;
    }
}

public interface ConnectivityReceiverListener {
    void onNetworkConnectionChanged(Boolean isConnected);
}

Step 3: Đăng ký BroadcastReceiver vào manifest

<receiver
            android:name=".common.ConnectivityReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

Step 4: Gọi hàm sử dụng lưu ý ở android >N sẽ không có kết quả trả về nên ở trường hợp này chúng ta cần if else theo version android sdk.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
                cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
                    @Override
                    public void onAvailable(Network network) {
                        DebugLog.d("CheckNetWork", "onAvailable");
                    }

                    @Override
                    public void onLost(Network network) {
                        DebugLog.d("CheckNetWork", "onUnavailable");
                    }
                });
            } else {
                connectivityReceiver = new ConnectivityReceiver();
                connectivityReceiver.setListener(this);
                getActivity().registerReceiver(connectivityReceiver
                        ,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
            }
        }

 

Nguyễn Linh

Chia sẻ để cùng tiến bộ...