NetworkCallback: nó là gì, ứng dụng và xử lý mạng trong Android

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

NetworkCallback là một lớp trừu tượng trong Android SDK để giám sát các thay đổi trạng thái mạng thông qua ConnectivityManager. Theo Android Developers Documentation (2025), việc sử dụng NetworkCallback cho phép ứng dụng của bạn phản hồi kịp thời khi kết nối, ngắt kết nối hoặc thay đổi đặc tính kết nối. ConnectivityManager.NetworkCallback cung cấp thông tin chi tiết về loại mạng, cổng captive và mất internet mà không cần thăm dò dịch vụ hệ thống liên tục.

Những Điểm Chính

  • NetworkCallback là một lớp trừu tượng tích hợp trong Android SDK để theo dõi trạng thái mạng thông qua ConnectivityManager.
  • Phương thức onAvailable được gọi khi thiết bị kết nối vào mạng, truyền một đối tượng Network với chi tiết kết nối.
  • Phương thức onLost kích hoạt khi kết nối mạng bị mất, cho phép ứng dụng dừng các yêu cầu mạng.
  • Phương thức onCapabilitiesChanged thông báo về thay đổi khả năng mạng — khả năng truy cập internet, cổng captive hoặc kết nối có tính phí.
  • Đăng ký được thực hiện qua registerNetworkCallback, hủy qua unregisterNetworkCallback trong vòng đời ứng dụng.

NetworkCallback là gì?

NetworkCallback là một lớp trừu tượng từ gói android.net, là một phần của Android SDK. Nó được thiết kế để nhận thông báo về các thay đổi trạng thái kết nối mạng thông qua dịch vụ hệ thống ConnectivityManager.

Trước NetworkCallback, các nhà phát triển sử dụng BroadcastReceiver để theo dõi thay đổi mạng. Cách tiếp cận này yêu cầu đăng ký liên tục trong tệp kê khai, hoạt động với độ trễ và không cung cấp thông tin chi tiết về đặc tính kết nối. Android 5.0 (API 21) đã giới thiệu NetworkCallback như một giải pháp thay thế linh hoạt và hiệu quả hơn.

Callback hoạt động không đồng bộ: ứng dụng đăng ký sự kiện thông qua ConnectivityManager và hệ thống gọi các phương thức callback khi trạng thái mạng thay đổi. Điều này loại bỏ nhu cầu thăm dò định kỳ trạng thái mạng, tiết kiệm tài nguyên pin và CPU.

Cách callback hoạt động trong Android

ConnectivityManager quản lý tất cả các giao diện mạng trên thiết bị — Wi-Fi, dữ liệu di động, Ethernet, VPN. Khi bất kỳ giao diện nào thay đổi, hệ thống tạo một đối tượng Network và chuyển nó đến phương thức tương ứng của callback đã đăng ký. Mỗi Network có một định danh duy nhất thay đổi khi kết nối lại.

Callback không bị ràng buộc với một loại mạng cụ thể — nó có thể theo dõi tất cả các giao diện có sẵn cùng lúc. Để lọc các loại kết nối, sử dụng lớp NetworkRequest, nơi chỉ định giao thức truyền tải yêu cầu (Wi-Fi, dữ liệu di động, Ethernet) và khả năng mạng.

Cách đăng ký NetworkCallback trong ứng dụng của bạn

Việc đăng ký NetworkCallback được thực hiện qua phương thức ConnectivityManager.registerNetworkCallback. Tham số đầu tiên là NetworkRequest.Builder mô tả yêu cầu mạng, tham số thứ hai là một phiên bản callback. Quyền ACCESS_NETWORK_STATE được yêu cầu trong tệp kê khai.

kotlin
class NetworkMonitor(private val context: Context) {

    private val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE)
            as ConnectivityManager

    private val callback =
        object : ConnectivityManager.NetworkCallback() {

        override fun onAvailable(network: Network) {
            Log.d("Network", "Available: ${network}")
        }

        override fun onLost(network: Network) {
            Log.d("Network", "Lost: ${network}")
        }
    }

    fun register() {
        connectivityManager.registerNetworkCallback(
            NetworkRequest.Builder().build(), callback
        )
    }

    fun unregister() {
        connectivityManager.unregisterNetworkCallback(callback)
    }
}

Đăng ký trong Activity và Fragment

Khuyến nghị đăng ký NetworkCallback khi ứng dụng ở tiền cảnh và hủy khi chuyển sang hậu cảnh. Trong Activity, sử dụng onStart và onStop để quản lý vòng đời callback. Trong Fragment, sử dụng onResume và onPause.

Để đơn giản hóa việc quản lý đăng ký, bạn có thể sử dụng các thành phần nhận biết vòng đời. Thư viện AndroidX Lifecycle cho phép tạo một LifecycleObserver tùy chỉnh tự động đăng ký và hủy callback khi trạng thái vòng đời thay đổi.

Đăng ký trong Service

Đối với tác vụ nền, việc đăng ký được thực hiện trong Service hoặc WorkManager. Lưu ý rằng trên Android 8+, các dịch vụ nền có giới hạn khởi chạy. WorkManager với NetworkType là cách đáng tin cậy hơn để thực thi tác vụ dưới một trạng thái mạng cụ thể, vì nó tích hợp với API tương thích và tôn trọng chế độ Doze.

Các phương thức chính của NetworkCallback

NetworkCallback cung cấp một tập hợp các phương thức được gọi khi trạng thái mạng thay đổi. Không phải tất cả các phương thức đều cần được ghi đè — chỉ triển khai những phương thức cần thiết cho tác vụ cụ thể của ứng dụng. onAvailable và onLost là tối thiểu cần thiết cho giám sát kết nối cơ bản.

Phương thứcKhi nào được gọiTham số
onAvailableMạng có sẵn để sử dụngNetwork — đối tượng mạng
onLostMạng bị mất hoặc ngắt kết nốiNetwork — đối tượng mạng
onCapabilitiesChangedKhả năng mạng đã thay đổiNetwork, NetworkCapabilities
onBlockedStatusChangedTrạng thái chặn đã thay đổiNetwork, Boolean
onNetworkSuspendedMạng bị tạm ngưng bởi hệ thốngNetwork
onNetworkResumedMạng được tiếp tục sau tạm ngưngNetwork

Phương thức onCapabilitiesChanged

Phương thức này là chìa khóa để lấy thông tin chi tiết về mạng. Tham số NetworkCapabilities chứa các cờ: NET_CAPABILITY_INTERNET — có quyền truy cập internet, NET_CAPABILITY_NOT_METERED — kết nối không giới hạn, NET_CAPABILITY_NOT_ROAMING — không chuyển vùng. Cũng có thể biết độ trễ tín hiệu và băng thông.

Cổng captive là một trường hợp đặc biệt: khi kết nối với mạng Wi-Fi công cộng qua cổng, phương thức onCapabilitiesChanged không hiển thị INTERNET ngay lập tức. Mạng có sẵn ban đầu nhưng không có internet — cần ủy quyền qua trình duyệt. Các nhà phát triển cần tính đến độ trễ này trong logic ứng dụng.

Phương thức onBlockedStatusChanged

Được gọi khi hệ thống chặn lưu lượng mạng cho ứng dụng — ví dụ, khi bật chế độ tiết kiệm dữ liệu hoặc hạn chế dữ liệu nền. onBlockedStatusChanged cho phép ứng dụng biết rằng các yêu cầu mạng của nó tạm thời bị cấm và chuyển sang xử lý cục bộ.

Ví dụ triển khai NetworkCallback

Hãy xem xét một triển khai NetworkCallback thực tế để giám sát truy cập internet và xử lý cổng captive. Ví dụ dưới đây cho thấy việc kiểm tra NET_CAPABILITY_INTERNET và xác thực kết nối qua yêu cầu HTTP đến máy chủ Google.

kotlin
val networkCallback = object : ConnectivityManager.NetworkCallback() {

    override fun onCapabilitiesChanged(
        network: Network,
        caps: NetworkCapabilities
    ) {
        val hasInternet = caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_INTERNET
        )
        val isMetered = caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_NOT_METERED
        ).not()

        when {
            hasInternet && isMetered ->
                Log.d("Network", "Mobile data connected")
            hasInternet ->
                Log.d("Network", "Wi-Fi connected")
            else ->
                Log.d("Network", "No internet access")
        }
    }

    override fun onLost(network: Network) {
        Log.d("Network", "Connection lost: ${network}")
        // Dừng yêu cầu mạng
    }
}

Xử lý cổng captive

Khi kết nối với mạng công cộng có ủy quyền (quán cà phê, sân bay), hệ thống đầu tiên thông báo onAvailable, nhưng onCapabilitiesChanged có thể không hiển thị INTERNET. Trong những trường hợp như vậy, cần xác thực thêm qua yêu cầu HTTP đến một điểm cuối ổn định, chẳng hạn https://www.google.com/generate_204.

Nếu yêu cầu trả về mã 204 — internet có sẵn. Nếu có chuyển hướng (301, 302, 307) — cần ủy quyền qua trình duyệt. Trong trường hợp này, bạn có thể mở WebView hoặc Intent với URL chuyển hướng để hoàn tất xác thực trên cổng.

kotlin
fun Context.validateInternet(network: Network) {
    CoroutineScope(Dispatchers.IO).launch {
        try {
            val url = URL("https://www.google.com/generate_204")
            val connection =
                network.openConnection(url) as HttpURLConnection
            connection.instanceFollowRedirects = false
            connection.connect()
            when (connection.responseCode) {
                HttpURLConnection.HTTP_NO_CONTENT ->
                    Log.d("Network", "Internet is available")
                in HttpURLConnection.HTTP_MOVED_PERM
                        ..HttpURLConnection.HTTP_TEMP_REDIRECT ->
                    Log.d("Network", "Captive portal detected")
            }
            connection.disconnect()
        } catch (e: Exception) {
            Log.e("Network", "Validation failed: ${e.message}")
        }
    }
}

Khác biệt so với các phương pháp giám sát mạng khác

Trước NetworkCallback, phương pháp chính để giám sát mạng là BroadcastReceiver với bộ lọc android.net.conn.CONNECTIVITY_CHANGE. Cách tiếp cận này có những nhược điểm đáng kể: độ trễ vài giây, thiếu thông tin về loại giao diện và tiêu thụ điện năng tăng do thiết bị liên tục đánh thức.

Một giải pháp thay thế hiện đại là LiveData hoặc StateFlow kết hợp với NetworkCallback. Mô hình này bao gồm việc bọc callback trong một luồng phản ứng tự động thông báo cho UI về các thay đổi trạng thái. Ví dụ, MutableStateFlow với kiểu NetworkStatus được cập nhật bên trong các phương thức callback và ViewCollector đăng ký các thay đổi.

Phương phápAPI LevelĐộ trễMức độ chi tiếtTiêu thụ điện năng
BroadcastReceiver1+caothấpcao
NetworkCallback21+thấpcaothấp
ConnectivityManager.getActiveNetwork23+tức thìtrung bìnhkhông
NWPathMonitor (iOS)iOS 12+thấpcaothấp

Làm việc với chế độ nền

Từ Android 10, các hạn chế nền trở nên nghiêm ngặt hơn và NetworkCallback có thể không được gọi khi ứng dụng ở chế độ nền. Đối với các tác vụ quan trọng — như tải dữ liệu khi mạng có sẵn — hãy sử dụng WorkManager với ràng buộc NetworkType.CONNECTED. WorkManager đảm bảo thực thi tác vụ khi điều kiện mạng được đáp ứng.

Trên Android 12+, có hạn chế về đăng ký trong tệp kê khai của BroadcastReceiver cho CONNECTIVITY_ACTION. Các nhà phát triển phải di chuyển sang NetworkCallback hoặc sử dụng WorkManager. Chính sách Google Play từ tháng 8 năm 2022 yêu cầu xóa đăng ký trong tệp kê khai cho hành động này.

Câu Hỏi Thường Gặp

Sự khác biệt giữa NetworkCallback và BroadcastReceiver cho mạng là gì?

BroadcastReceiver với CONNECTIVITY_CHANGE chỉ cung cấp sự kiện thay đổi mạng mà không có chi tiết và với độ trễ lên đến vài giây. NetworkCallback hoạt động không đồng bộ, cung cấp đối tượng Network, loại giao diện, khả năng kết nối và không yêu cầu đăng ký trong tệp kê khai, điều bị cấm trên Android 12+.

Có thể sử dụng NetworkCallback ở chế độ nền không?

Trên Android 10+, các hạn chế nền có thể trì hoãn hoặc ngăn việc gọi NetworkCallback. Đối với tác vụ nền, hãy sử dụng WorkManager với ràng buộc NetworkType — nó đảm bảo thực thi tác vụ khi điều kiện được đáp ứng bất kể chế độ tiết kiệm pin.

Làm thế nào để hủy đăng ký NetworkCallback?

Gọi phương thức unregisterNetworkCallback trên ConnectivityManager, truyền cùng phiên bản callback đã sử dụng khi đăng ký. Callback không được hủy có thể gây rò rỉ bộ nhớ vì hệ thống giữ tham chiếu đến nó. Luôn hủy trong onStop hoặc onDestroy.

Phiên bản Android tối thiểu cần thiết cho NetworkCallback là gì?

NetworkCallback có sẵn từ API Level 21 (Android 5.0 Lollipop). Đối với thiết bị có phiên bản cũ hơn, hãy sử dụng BroadcastReceiver hoặc thư viện tương thích như AndroidX Activity NetworkCallback, bao bọc API để hỗ trợ rộng hơn.

Làm thế nào để kiểm tra trạng thái mạng hiện tại mà không cần callback?

Sử dụng ConnectivityManager.getActiveNetwork (API 23+) cùng với getNetworkCapabilities. Phương thức trả về mạng đang hoạt động hiện tại đồng bộ, mà không đăng ký thay đổi. Đối với API 21-22, sử dụng getActiveNetworkInfo, được đánh dấu không dùng nữa trong các phiên bản mới hơn.

Tổng Kết

  • NetworkCallback là một lớp trừu tượng của Android SDK để giám sát mạng không đồng bộ qua ConnectivityManager mà không cần thăm dò liên tục.
  • Phương thức onAvailable thông báo về kết nối mạng, onLost — về mất kết nối, onCapabilitiesChanged — về thay đổi khả năng mạng.
  • Đăng ký được thực hiện qua registerNetworkCallback với NetworkRequest và một phiên bản callback.
  • Vòng đời yêu cầu hủy đăng ký trong onStop cho Activity và onPause cho Fragment.
  • Cổng captive được xử lý qua yêu cầu HTTP bổ sung đến generate_204 để xác minh truy cập internet thực tế.
  • NetworkCallback đã thay thế BroadcastReceiver cho CONNECTIVITY_ACTION, bị cấm trong tệp kê khai trên Android 12+.
  • Đối với tác vụ nền, hãy sử dụng WorkManager với NetworkType.CONNECTED thay vì đăng ký NetworkCallback trực tiếp.

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