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

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

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

ضبط طلب شبكة

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

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

Kotlin

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

Java

NetworkRequest networkRequest = new 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 معلومات حول الإمكانات الحالية للشبكة.

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);