مراقبة حالة الاتصال وقياس عدد الاتصالات

توفّر ConnectivityManager واجهة برمجة تطبيقات تتيح لك طلب اتصال الجهاز بشبكة استنادًا إلى شروط مختلفة تشمل إمكانات الجهاز وخيارات نقل البيانات.

يوفّر تنفيذ معاودة الاتصال معلومات لتطبيقك حول حالة اتصال الجهاز بالإضافة إلى إمكانات الشبكة المتصلة حاليًا. تتيح لك واجهة برمجة التطبيقات تحديد ما إذا كان الجهاز متصلاً حاليًا بشبكة تستوفي متطلبات تطبيقك.

ضبط طلب شبكة

لتحديد نوع نقل الشبكة، مثل اتصال Wi-Fi أو اتصال شبكة الجوّال، وإمكانات الشبكة المتصلة حاليًا، مثل الاتصال بالإنترنت، يجب ضبط طلب الشبكة.

يجب الإعلان عن NetworkRequest يصف احتياجات تطبيقك للاتصال بالشبكة. ينشئ الرمز التالي طلبًا لشبكة متصلة بالإنترنت وتستخدم اتصال Wi-Fi أو إيثرنت أو اتصال شبكة جوّال لنوع النقل.

private val networkRequest = NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
    .build()

يُرجى العِلم أنّ بعض الاتصالات قد تكون أكثر تكلفة من غيرها (على سبيل المثال، عادةً ما يكون الاتصال بالشبكة الجوّالة مكلفًا). استخدِم NetworkCapabilities#NET_CAPABILITY_NOT_METERED لتحديد ما إذا كان الاتصال مكلفًا. عند الاتصال بشبكة تفرض تكلفة استخدام، حاوِل تقليل استهلاك تطبيقك للبيانات أو تأجيله إلى أن يتصل الجهاز بشبكة تفرض تكلفة ثابتة.

ضبط معاودة الاتصال بالشبكة

عند تسجيل NetworkRequest باستخدام ConnectivityManager، عليك تنفيذ NetworkCallback لتلقّي إشعارات بشأن التغييرات في حالة الاتصال وإمكانات الشبكة.

تشمل الدوال الأكثر استخدامًا في NetworkCallback ما يلي:

  • onAvailable() تشير إلى أنّ الجهاز متصل بشبكة جديدة تستوفي متطلبات الإمكانات ونوع النقل المحدّدة في NetworkRequest.
  • onLost() يشير إلى أنّ الجهاز قد فقد الاتصال بالشبكة.
  • onCapabilitiesChanged() يشير إلى أنّ إمكانات الشبكة قد تغيّرت. يوفّر الكائن NetworkCapabilities معلومات عن الإمكانات الحالية للشبكة.

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        // Network is available for use.
    }

    // Network capabilities have changed for the network.
    override fun onCapabilitiesChanged(
        network: Network,
        networkCapabilities: NetworkCapabilities
    ) {
        val unmetered =
            networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
        if (!unmetered) {
            // Reduce data usage, or delay it until the network is unmetered.
        }
    }

    override fun onLost(network: Network) {
        // Lost network connection.
    }
}

التسجيل لتلقّي آخر الأخبار حول الشبكة

بعد تحديد NetworkRequest وNetworkCallback، استخدِم الدالة requestNetwork() أو registerNetworkCallback() للبحث عن شبكة للاتصال بها من الجهاز الذي يستوفي NetworkRequest. بعد ذلك، يتم إبلاغ "NetworkCallback" بالحالة.

val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)