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

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

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

ضبط طلب شبكة

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

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

Kotlin

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

Java

NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build();

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

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

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

وتشمل الدوال المنفَّذة الأكثر شيوعًا في NetworkCallback ما يلي:

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

Kotlin

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

    // Network capabilities have changed for the network
    override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
    ) {
        super.onCapabilitiesChanged(network, networkCapabilities)
        val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
    }

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

Java

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
    }

    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
    }
};

التسجيل للحصول على تحديثات الشبكة

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

Kotlin

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

Java

ConnectivityManager connectivityManager =
        (ConnectivityManager) getSystemService(ConnectivityManager.class);
connectivityManager.requestNetwork(networkRequest, networkCallback);