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

توفّر 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);