Connectivity Manager: nó là gì, các phương pháp và giám sát kết nối

Tác giả: IT Sectr Đã đăng: 2026-03-10 Thời gian đọc: 9 phút

Connectivity Manager là một dịch vụ hệ thống Android cung cấp cho các ứng dụng thông tin về trạng thái kết nối mạng của thiết bị. Nó cho phép kiểm tra khả năng truy cập internet, xác định loại mạng (Wi-Fi, dữ liệu di động, Ethernet), theo dõi các thay đổi kết nối và quản lý các yêu cầu mạng dựa trên chất lượng kết nối. Theo Android Developers, 2025, ConnectivityManager là API chính để giám sát mạng và là một phần của Android Framework kể từ API Level 1.

Các điểm chính

  • Connectivity Manager — một dịch vụ hệ thống Android để giám sát kết nối mạng của thiết bị.
  • NetworkCallback — cơ chế chính để theo dõi các thay đổi mạng thông qua đăng ký callback.
  • NetworkCapabilities — một lớp cung cấp thông tin chi tiết về khả năng của mạng hiện tại (Wi-Fi, dữ liệu di động, VPN, Ethernet).
  • NetworkRequest — một bộ lọc để đăng ký các loại mạng cụ thể với các đặc tính xác định.
  • getActiveNetworkInfo() — một phương thức không dùng nữa (không dùng từ API 29), được thay thế bởi NetworkCallback và registerDefaultNetworkCallback.

Connectivity Manager là gì?

ConnectivityManager là một dịch vụ hệ thống của hệ điều hành Android, có thể truy cập qua Context.getSystemService(Context.CONNECTIVITY_SERVICE). Nó cung cấp API để lấy thông tin về kết nối mạng của thiết bị, giám sát các thay đổi mạng và quản lý các yêu cầu mạng của ứng dụng. Connectivity Manager đã là một phần của Android Framework kể từ phiên bản đầu tiên của nền tảng (API Level 1) và đã trải qua nhiều thay đổi đáng kể qua nhiều thập kỷ: từ getActiveNetworkInfo() đơn giản đến mô hình phản ứng hiện đại với NetworkCallback và NetworkRequest.

Các khả năng chính của Connectivity Manager bao gồm: kiểm tra sự hiện diện của kết nối mạng đang hoạt động, xác định loại mạng (Wi-Fi, dữ liệu di động, Ethernet, Bluetooth, VPN), giám sát các thay đổi trạng thái mạng theo thời gian thực, lấy thông tin về băng thông và độ trễ, và quản lý các yêu cầu mạng của ứng dụng. ConnectivityManager được sử dụng cùng với WorkManager và Repository để triển khai kiến trúc Offline-First, tải nội dung thích ứng và tối ưu hóa ứng dụng dựa trên chất lượng kết nối.

Bắt đầu từ Android 10 (API 29), Google đã thay đổi cách tiếp cận làm việc với ConnectivityManager. Phương thức getActiveNetworkInfo() được tuyên bố không dùng nữa, và thay vào đó nên sử dụng registerDefaultNetworkCallback() hoặc registerNetworkCallback() với NetworkRequest. API mới cung cấp thông tin mạng chi tiết hơn, bao gồm khả năng phát hiện cổng bắt (Wi-Fi có xác thực) và đánh giá chất lượng kết nối. ConnectivityManager cũng được tích hợp với họ Jetpack: thư viện ConnectivityManager được phát hành vào năm 2024 như một phần của Jetpack để đơn giản hóa việc giám sát mạng trong các ứng dụng Compose.

Vai trò của Connectivity Manager trong kiến trúc ứng dụng

Trong kiến trúc Android hiện đại, Connectivity Manager được sử dụng ở cấp độ kho lưu trữ hoặc UseCase để đưa ra quyết định về các yêu cầu mạng. Lớp Kho lưu trữ kiểm tra trạng thái mạng trước khi gọi API: nếu mạng không khả dụng, dữ liệu được trả về từ bộ nhớ cục bộ (Room). Nếu mạng khả dụng, một yêu cầu được gửi đến máy chủ và kết quả được lưu trong Room. ViewModel đăng ký Flow từ Room và không biết về chi tiết tương tác mạng — điều này cho phép kiểm thử từng lớp một cách độc lập.

Cách Connectivity Manager hoạt động

Connectivity Manager lấy thông tin trạng thái mạng từ dịch vụ hệ thống connectivity, tương tác với các giao diện mạng của nhân Linux. Khi thiết bị kết nối với Wi-Fi hoặc bật dữ liệu di động, nhân hệ thống thông báo cho dịch vụ hệ thống, dịch vụ này cập nhật trạng thái nội bộ và thông báo cho tất cả các callback đã đăng ký. Kiến trúc của ConnectivityManager được xây dựng trên mô hình Observer: ứng dụng đăng ký NetworkCallback và nhận thông báo về mọi thay đổi mạng — thiết lập kết nối, mất kết nối, thay đổi loại mạng hoặc suy giảm chất lượng.

API hiện đại của ConnectivityManager sử dụng NetworkRequest để lọc các sự kiện mạng. NetworkRequest cho phép chỉ định các yêu cầu cho mạng: phương thức truyền tải (Transport.WIFI, Transport.CELLULAR, Transport.ETHERNET), khả năng internet (NetworkCapabilities.NET_CAPABILITY_INTERNET) và các tiêu chí khác. Nếu một ứng dụng chỉ cần Wi-Fi để tải xuống các tệp lớn, nó sẽ tạo NetworkRequest với Transport.WIFI và đăng ký callback. Hệ thống sẽ chỉ thông báo cho ứng dụng khi kết nối Wi-Fi thay đổi, bỏ qua các sự kiện mạng di động.

Một tính năng quan trọng của Connectivity Manager trên Android 12+ là mạng dựa trên khả năng. Ứng dụng không chỉ kiểm tra “có internet không?” mà còn có thể đánh giá loại lưu lượng nào khả dụng. Ví dụ, NET_CAPABILITY_NOT_METERED chỉ kết nối không giới hạn (Wi-Fi), NET_CAPABILITY_NOT_ROAMING chỉ thiết bị không chuyển vùng. Điều này cho phép đưa ra các quyết định: chỉ tải video qua Wi-Fi, hoãn đồng bộ khi chuyển vùng, hoặc chỉ sử dụng dữ liệu di động cho các yêu cầu quan trọng.

API LevelPhương pháp được khuyến nghịTrạng thái
1-22getActiveNetworkInfo()Không dùng
21+NetworkCallback + registerNetworkCallback()Khuyến nghị
24+registerDefaultNetworkCallback()Khuyến nghị
28+getActiveNetwork() + NetworkCapabilitiesThay thế
31+registerBestMatchingNetworkCallback()API mới

Quyền cho Connectivity Manager

Để sử dụng Connectivity Manager trong ứng dụng Android, cần có quyền. ACCESS_NETWORK_STATE là quyền bắt buộc để đọc thông tin mạng, được khai báo trong AndroidManifest.xml. Nếu không có quyền này, ConnectivityManager sẽ trả về null cho getActiveNetwork() và sẽ không gọi callback. Để thực hiện các thao tác mạng, cũng cần quyền INTERNET. Bắt đầu từ Android 10 (API 29), ứng dụng có thể kiểm tra trạng thái mạng mà không cần quyền bổ sung trong thời gian chạy — ACCESS_NETWORK_STATE là quyền bình thường và được cấp tự động khi cài đặt ứng dụng.

Các phương pháp chính của Connectivity Manager

Connectivity Manager hiện đại cung cấp một số phương pháp chính để làm việc với mạng. getActiveNetwork() (API 23+) trả về đối tượng Network của mạng đang hoạt động hiện tại hoặc null nếu thiết bị không được kết nối. Phương thức này không yêu cầu callback và phù hợp cho việc kiểm tra một lần. Đối tượng Network có thể được truyền cho NetworkCapabilities để lấy thông tin chi tiết: loại phương thức truyền tải, trạng thái tính cước, chuyển vùng, khả năng internet và các đặc tính khác.

registerDefaultNetworkCallback() (API 24+) là cách ưu tiên để giám sát mạng. Ứng dụng đăng ký một callback được gọi khi có bất kỳ thay đổi nào đối với mạng mặc định (mạng mà ứng dụng gửi lưu lượng qua đó). Callback nhận được một đối tượng Network có thể được sử dụng để liên kết socket và trình khách HTTP. Phương thức này thay thế getActiveNetworkInfo() không dùng nữa và cung cấp giám sát mạng phản ứng mà không cần thăm dò.

registerNetworkCallback() (API 21+) cho phép đăng ký các thay đổi của một loại mạng cụ thể thông qua NetworkRequest. Ví dụ, một ứng dụng có thể theo dõi chỉ các mạng Wi-Fi bằng cách sử dụng new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(). Hệ thống sẽ thông báo cho ứng dụng về kết nối/ngắt kết nối Wi-Fi mà không ảnh hưởng đến các sự kiện mạng di động. NetworkCapabilities.getLinkDownstreamBandwidthKbps() trả về ước tính băng thông xuống tính bằng kbit/s, cho phép điều chỉnh chất lượng nội dung theo tốc độ kết nối.

Phương phápAPI tối thiểuMục đích
getActiveNetwork()23Lấy mạng đang hoạt động hiện tại
getNetworkCapabilities()21Lấy khả năng mạng (loại, tính cước, chuyển vùng)
registerDefaultNetworkCallback()24Giám sát mạng mặc định
registerNetworkCallback()21Giám sát mạng theo bộ lọc NetworkRequest
unregisterNetworkCallback()21Hủy đăng ký callback
getActiveNetworkInfo()1Không dùng, không sử dụng

ConnectivityManager trong Jetpack Compose

Thư viện Jetpack Connectivity (androidx.core:core-ktx) cung cấp các phần mở rộng tiện lợi để làm việc với ConnectivityManager trong Compose. Hàm ConnectivityManager.observeAsState() trả về State được cập nhật khi mạng thay đổi. Thành phần @Composable NetworkStatus() hiển thị trạng thái kết nối và tự động vẽ lại khi có thay đổi. Điều này giải phóng nhà phát triển khỏi việc quản lý thủ công các callback và vòng đời Activity/Fragment.

NetworkCallback và xử lý thay đổi mạng

ConnectivityManager.NetworkCallback là một lớp trừu tượng với các phương thức được hệ thống gọi khi trạng thái mạng thay đổi. onAvailable(Network) được gọi khi một mạng khả dụng. Ứng dụng nhận một đối tượng Network có thể được sử dụng để liên kết socket qua Network.bindSocket(). onLost(Network) được gọi khi một mạng không khả dụng. Ứng dụng nên chuyển sang dữ liệu cục bộ hoặc hiển thị thông báo không có kết nối. onCapabilitiesChanged(Network, NetworkCapabilities) được gọi khi các đặc tính mạng thay đổi (ví dụ, khi chuyển từ Wi-Fi sang dữ liệu di động).

Việc xử lý thay đổi mạng đúng cách đòi hỏi phải xem xét vòng đời của thành phần. Callback phải được đăng ký trong onStart()/onResume() và hủy trong onStop()/onPause(). Nếu callback không bị hủy, nó có thể tiếp tục chạy sau khi Activity bị phá hủy, gây rò rỉ bộ nhớ và NullPointerException tiềm ẩn khi callback cố gắng cập nhật giao diện của một thành phần đã bị phá hủy. Sử dụng lifecycleScope hoặc repeatOnLifecycle để quản lý đăng ký tự động. Trong Jetpack Compose, sử dụng DisposableEffect để đăng ký và hủy callback.

Xử lý cổng bắt là một tính năng quan trọng của ConnectivityManager bắt đầu từ Android 10. CAPTIVE_PORTAL là kịch bản khi mạng Wi-Fi khả dụng nhưng yêu cầu xác thực qua trang web (sân bay, khách sạn, quán cà phê). NetworkCapabilities.NET_CAPABILITY_VALIDATED cho biết mạng có quyền truy cập internet đầy đủ. Nếu thiếu NET_CAPABILITY_VALIDATED, ứng dụng có thể mở trình duyệt để xác thực cổng bắt. Phương thức isCaptivePortal(), được thêm vào Android 11 (API 30), được sử dụng để phát hiện cổng bắt.

Mạng cho mục đích cụ thể (NetworkRequest)

ConnectivityManager cho phép yêu cầu mạng cho các mục đích cụ thể thông qua requestNetwork() và bindProcessToNetwork(). Ví dụ, một ứng dụng tải xuống tệp lớn có thể yêu cầu mạng Wi-Fi ngay cả khi dữ liệu di động đang hoạt động. Để làm điều này, một NetworkRequest được tạo với addTransportType(TRANSPORT_WIFI), và khi Wi-Fi khả dụng, hệ thống gọi onAvailable(). Ứng dụng liên kết các socket với mạng này qua network.bindSocket() hoặc OkHttp với đối tượng Network được cấu hình. Điều này cung cấp khả năng kiểm soát linh hoạt việc sử dụng các giao diện mạng.

Ví dụ triển khai bằng Kotlin

Hãy xem một ví dụ hoàn chỉnh về việc sử dụng ConnectivityManager với API hiện đại (NetworkCallback) trong Clean Architecture. NetworkMonitor là một lớp bao bọc xung quanh ConnectivityManager cung cấp trạng thái mạng phản ứng qua StateFlow. ViewModel đăng ký Flow này và truyền trạng thái cho UI. Repository sử dụng NetworkMonitor để đưa ra quyết định về các yêu cầu mạng. Cách tiếp cận này đảm bảo khả năng kiểm thử và cô lập các phụ thuộc nền tảng.

Ví dụ dưới đây cho thấy cách sử dụng ConnectivityManager với registerDefaultNetworkCallback một cách chính xác. Lớp NetworkMonitor đóng gói công việc với dịch vụ hệ thống và cung cấp Kotlin Flow sạch sẽ. Nó đăng ký callback khi bắt đầu và hủy nó khi kết thúc vòng đời. Hoạt động bất đồng bộ được đảm bảo thông qua coroutines và callbackFlow — cầu nối giữa kiểu callback của ConnectivityManager và kiểu Flow phản ứng của Kotlin.

kotlin
class NetworkMonitor(
    private val connectivityManager: ConnectivityManager
) {
    val isOnline: StateFlow<Boolean> = callbackFlow {
        val callback = object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                trySend(true)
            }
            override fun onLost(network: Network) {
                trySend(false)
            }
            override fun onCapabilitiesChanged(
                network: Network,
                caps: NetworkCapabilities
            ) {
                val connected = caps.hasCapability(
                    NetworkCapabilities.NET_CAPABILITY_INTERNET
                )
                trySend(connected)
            }
        }
        connectivityManager.registerDefaultNetworkCallback(callback)
        awaitClose {
            connectivityManager.unregisterNetworkCallback(callback)
        }
    }.stateIn(
        CoroutineScope(Dispatchers.Default),
        SharingStarted.WhileSubscribed(5000),
        initialValue = checkInitialState()
    )

    private fun checkInitialState(): Boolean {
        val network = connectivityManager.getActiveNetwork() ?: return false
        val caps = connectivityManager.getNetworkCapabilities(network) ?: return false
        return caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_INTERNET
        )
    }
}

Sử dụng NetworkMonitor trong ViewModel và Repository

ViewModel đăng ký NetworkMonitor.isOnline qua stateIn() và truyền trạng thái cho Compose. Repository kiểm tra giá trị isOnline.value hiện tại trước khi gọi API: nếu false — trả về Flow từ Room. Nếu true — gọi API, lưu kết quả vào Room và trả về Flow từ Room. WorkManager sử dụng NetworkType.CONNECTED để giới hạn các tác vụ nền. Việc kiểm thử NetworkMonitor được thực hiện với đối tượng mock ConnectivityManager và NetworkCallback giả, cho phép mô phỏng mọi kịch bản mạng trong các bài kiểm thử đơn vị.

Các thực hành tốt nhất và lỗi thường gặp

Quy tắc đầu tiên khi làm việc với ConnectivityManager là không sử dụng API không dùng nữa. getActiveNetworkInfo() không dùng từ API 29 và có thể trả về dữ liệu không chính xác trên các phiên bản Android mới. Thay vào đó, hãy sử dụng getActiveNetwork() + getNetworkCapabilities() cho việc kiểm tra một lần và registerDefaultNetworkCallback() cho giám sát liên tục. Phương pháp cũ cũng không phân biệt giữa mạng có cổng bắt và internet đầy đủ, dẫn đến kết quả dương tính giả.

Quy tắc thứ hai là luôn hủy đăng ký callback. Nếu một Activity đăng ký NetworkCallback trong onStart() nhưng không hủy nó trong onStop(), callback tiếp tục chạy sau khi Activity bị phá hủy. Điều này gây rò rỉ bộ nhớ và NullPointerException tiềm ẩn khi callback cố gắng cập nhật giao diện của một thành phần đã bị phá hủy. Sử dụng lifecycleScope hoặc repeatOnLifecycle để quản lý đăng ký tự động. Trong Jetpack Compose, sử dụng DisposableEffect để đăng ký và hủy callback.

Lỗi thường gặp thứ ba là chỉ kiểm tra khả năng khả dụng của mạng mà không xem xét chất lượng. Một câu hỏi đơn giản “có internet không?” không đủ để đưa ra quyết định. Ứng dụng nên kiểm tra NET_CAPABILITY_NOT_METERED để tải tệp lớn, NET_CAPABILITY_NOT_ROAMING để đồng bộ nền và NET_CAPABILITY_VALIDATED để xác nhận quyền truy cập internet. Bỏ qua các cờ này dẫn đến ứng dụng cố gắng tải video khi chuyển vùng hoặc đồng bộ dữ liệu qua cổng bắt của khách sạn.

Quy tắc thứ tư là không sử dụng ConnectivityManager để kiểm tra khả năng khả dụng của một máy chủ cụ thể. ConnectivityManager báo cáo trạng thái mạng trên thiết bị, nhưng không đảm bảo rằng máy chủ có thể truy cập được. Để kiểm tra khả năng khả dụng của API, hãy sử dụng yêu cầu HTTP với thời gian chờ ngắn hoặc Health Check. ConnectivityManager + ping HTTP là một kết hợp đáng tin cậy: đầu tiên kiểm tra sự hiện diện của mạng, sau đó thực hiện yêu cầu nhẹ đến máy chủ để xác nhận khả năng truy cập thực tế.

Kiểm thử ConnectivityManager

Đối với kiểm thử đơn vị, hãy sử dụng Robolectric với ShadowConnectivityManager, cho phép mô phỏng các trạng thái mạng. Đối với kiểm thử tích hợp — Android Test Orchestrator với chuyển đổi Chế độ Máy bay. Trong các bài kiểm thử, hãy xác minh các kịch bản: chuyển từ trực tuyến sang ngoại tuyến, Wi-Fi xuất hiện khi dữ liệu di động đang hoạt động, mất mạng trong khi thực hiện yêu cầu, cổng bắt, chuyển vùng. Đối với việc mô phỏng trong kiểm thử đơn vị, hãy sử dụng giao diện bao bọc (ví dụ, NetworkMonitorInterface) có thể được thay thế bằng đối tượng mock mà không có phụ thuộc nền tảng.

Câu hỏi thường gặp

Làm thế nào để kiểm tra xem thiết bị có kết nối internet không?

Cách hiện đại là sử dụng registerDefaultNetworkCallback() với kiểm tra NET_CAPABILITY_INTERNET trong onCapabilitiesChanged(). Đối với kiểm tra một lần: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false. Phương thức getActiveNetworkInfo() không dùng nữa không được khuyến nghị từ API 29+.

Cần quyền gì cho ConnectivityManager?

Để đọc thông tin mạng, cần quyền android.permission.ACCESS_NETWORK_STATE. Đây là quyền bình thường — nó được cấp tự động khi cài đặt ứng dụng và không yêu cầu yêu cầu trong thời gian chạy. Để thực hiện các thao tác mạng (yêu cầu HTTP), cũng cần quyền INTERNET.

Sự khác biệt giữa registerDefaultNetworkCallback và registerNetworkCallback là gì?

registerDefaultNetworkCallback() giám sát mạng mặc định — mạng mà ứng dụng gửi lưu lượng chính qua đó. registerNetworkCallback(NetworkRequest) giám sát các mạng phù hợp với bộ lọc nhất định (ví dụ, chỉ Wi-Fi). Callback mặc định đơn giản hơn và bao phủ 90% kịch bản, trong khi yêu cầu tùy chỉnh dành cho các yêu cầu loại mạng cụ thể.

Làm thế nào để xác định loại mạng: Wi-Fi hay dữ liệu di động?

Sử dụng NetworkCapabilities: caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) cho Wi-Fi, hasTransport(TRANSPORT_CELLULAR) cho dữ liệu di động. Không sử dụng ConnectivityManager.getActiveNetworkInfo().getType() — phương thức này không dùng nữa. NetworkCapabilities có sẵn qua connectivityManager.getNetworkCapabilities(network).

Tại sao getActiveNetworkInfo() bị không dùng nữa?

getActiveNetworkInfo() không dùng nữa do không chính xác: nó không phân biệt giữa mạng có cổng bắt và internet đầy đủ, và không cung cấp thông tin về băng thông hoặc chuyển vùng. Bắt đầu từ Android 10, phương thức này có thể trả về null hoặc dữ liệu không chính xác cho các kết nối đa mạng. Sự thay thế là getActiveNetwork() + NetworkCapabilities.

Tóm tắt

  • ConnectivityManager — một dịch vụ hệ thống Android để giám sát kết nối mạng, có thể truy cập qua getSystemService(CONNECTIVITY_SERVICE).
  • API hiện đại — registerDefaultNetworkCallback() + NetworkCapabilities, thay thế getActiveNetworkInfo() không dùng nữa từ API 29.
  • NetworkCapabilities — một lớp để kiểm tra loại mạng (Wi-Fi, Cellular), tính cước, chuyển vùng và xác thực kết nối internet.
  • NetworkCallback — cơ chế giám sát phản ứng với các phương thức onAvailable, onLost và onCapabilitiesChanged để theo dõi các thay đổi mạng.
  • NetworkRequest — bộ lọc để đăng ký mạng thuộc loại cụ thể, được sử dụng với registerNetworkCallback() để kiểm soát chính xác.
  • Quyền ACCESS_NETWORK_STATE — bắt buộc để làm việc với ConnectivityManager, được cấp tự động khi cài đặt ứng dụng.
  • Các thực hành tốt nhất — hủy callback trong onStop(), kiểm tra NET_CAPABILITY_NOT_METERED và NET_CAPABILITY_VALIDATED, không chỉ dựa vào sự hiện diện của mạng mà không kiểm tra chất lượng.

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm