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

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