قراءة حالة الشبكة

يتيح Android للتطبيقات إمكانية التعرّف على التغييرات الديناميكية في الاتصال. استخدم الفئات التالية لتتبع تغييرات الاتصال والاستجابة لها:

  • يخبر ConnectivityManager تطبيقك بحالة الاتصال في النظام.
  • تمثّل الفئة Network إحدى الشبكات التي يتصل بها الجهاز. يمكنك استخدام الكائن Network كمفتاح لجمع معلومات عن الشبكة من خلال "ConnectivityManager" أو لربط المقابس على الشبكة. عند انقطاع الاتصال بالشبكة، يتوقف عنصر Network عن قابلية الاستخدام. حتى إذا أعاد الجهاز الاتصال بالجهاز نفسه لاحقًا، سيمثل كائن Network جديد الشبكة الجديدة.
  • يحتوي العنصر LinkProperties على معلومات عن الرابط الخاص بشبكة، مثل قائمة خوادم نظام أسماء النطاقات وعناوين IP المحلية ومسارات الشبكة المثبّتة على الشبكة.
  • ويحتوي عنصر NetworkCapabilities على معلومات حول خصائص الشبكة، مثل عمليات النقل (Wi-Fi والجهاز الجوّال والبلوتوث) والميزات التي تستطيع الشبكة تنفيذها. على سبيل المثال، يمكنك الاستعلام عن الكائن لتحديد ما إذا كانت الشبكة قادرة على إرسال رسائل وسائط متعددة أو ما إذا كانت وراء مدخل مقيّد أو تفرض تكلفة استخدام.

يمكن للتطبيقات المهتمة بحالة الاتصال الفورية في أي وقت استدعاء طرق ConnectivityManager لمعرفة نوع الشبكة المتاحة. هذه الطرق مفيدة لتصحيح الأخطاء ومراجعة لقطة من حين لآخر للاتصال المتاح في أي وقت.

مع ذلك، لا تخبر طرق ConnectivityManager المتزامنة تطبيقك بأي شيء يحدث بعد إجراء مكالمة، ولذلك لا تسمح لك بتحديث واجهة المستخدم. ولا يمكنهم أيضًا تعديل سلوك التطبيق استنادًا إلى قطع الاتصال بالشبكة أو عند تغيير إمكانيات الشبكة.

يمكن أن تتغير إمكانية الاتصال في أي وقت، ويجب أن تحصل معظم التطبيقات على عرض حديث ومحدّث دائمًا لحالة الشبكات على الجهاز. يمكن للتطبيقات تسجيل معاودة الاتصال باستخدام ConnectivityManager ليتم تنبيهك إلى التغييرات التي يهمها التطبيق. باستخدام معاودة الاتصال، يمكن لتطبيقك أن يتفاعل على الفور مع أي تغيير ذي صلة في الاتصال، دون الحاجة إلى اللجوء إلى استطلاع باهظ الثمن قد يفوتك تحديثات سريعة.

لا يتطلّب استخدام NetworkCallback وغيره من الطرق لمعرفة حالة اتصال الجهاز أي إذن معيّن. ومع ذلك، تخضع بعض الشبكات لأذونات محدّدة. على سبيل المثال، قد تكون هناك شبكات مقيّدة غير متاحة للتطبيقات. يتطلّب الربط بشبكة في الخلفية الحصول على إذن CHANGE_NETWORK_STATE. وقد تحتاج بعض المكالمات إلى أذونات محددة لتشغيلها. يمكنك الرجوع إلى الوثائق المحددة لكل مكالمة للحصول على التفاصيل.

الحصول على حالة فورية

يمكن لجهاز Android الذي يعمل بنظام التشغيل Android الاحتفاظ بالعديد من الاتصالات في الوقت نفسه. للحصول على معلومات حول حالة الشبكة الحالية، عليك أولاً الحصول على مثيل من ConnectivityManager:

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java)

Java

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

بعد ذلك، استخدِم هذا المثيل للحصول على إشارة إلى الشبكة التلقائية الحالية لتطبيقك:

Kotlin

val currentNetwork = connectivityManager.getActiveNetwork()

Java

Network currentNetwork = connectivityManager.getActiveNetwork();

في ما يتعلّق بشبكة معيّنة، يمكن لتطبيقك طلب الحصول على معلومات عنها:

Kotlin

val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
val linkProperties = connectivityManager.getLinkProperties(currentNetwork)

Java

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork);
LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);

للحصول على وظائف أكثر فائدة، يمكنك تسجيل NetworkCallback. لمزيد من المعلومات عن تسجيل عمليات معاودة الاتصال بالشبكة، يمكنك الاطّلاع على الاستماع إلى أحداث الشبكة.

إمكانات الشبكة وخصائص الارتباط

يقدّم الكائنان NetworkCapabilities وLinkProperties معلومات عن جميع السمات التي يعرفها النظام عن الشبكة.

يعرف الكائن LinkProperties المسارات وعناوين الروابط واسم الواجهة ومعلومات الخادم الوكيل (إن وُجدت) وخوادم نظام أسماء النطاقات. استدعِ الطريقة ذات الصلة في كائن LinkProperties لاسترداد المعلومات التي تحتاج إليها.

يتضمّن العنصر NetworkCapabilities معلومات حول وسائل النقل الخاصة بالشبكة وإمكاناتها.

النقل هو تجريد الوسيط المادي الذي تعمل الشبكة عليه. من الأمثلة الشائعة على وسائل النقل هي Ethernet وWi-Fi والجهاز الجوّال. يمكن أن تكون الشبكات الافتراضية الخاصة وشبكات Wi-Fi من الند للند وسائل نقل أيضًا. على نظام Android، يمكن أن تتضمن الشبكة عدة وسائل نقل في الوقت نفسه. مثال على ذلك هو شبكة VPN التي تعمل عبر كل من شبكة Wi-Fi وشبكات الجوّال. وتتضمّن شبكة VPN وسائل النقل عبر Wi-Fi والأجهزة الجوّالة وشبكة VPN. لمعرفة ما إذا كانت الشبكة لديها وسيلة نقل معيّنة، استخدِم الطريقة NetworkCapabilities.hasTransport(int) مع أحد ثوابت NetworkCapabilities.TRANSPORT_*.

تصف القدرة ملكية الشبكة. تشمل أمثلة الإمكانات "MMS" و"NOT_METERED" و"INTERNET". يمكن للشبكة التي لديها إمكانية إرسال رسائل الوسائط المتعددة إرسال واستقبال رسائل من خلال خدمة رسائل الوسائط المتعددة، ولا يمكن لأي شبكة إرسال هذه الرسائل. إنّ الشبكة التي تتضمّن ميزة NOT_METERED لا تصدر فواتير من المستخدم مقابل البيانات. يمكن لتطبيقك البحث عن الإمكانات المناسبة باستخدام الطريقة NetworkCapabilities.hasCapability(int) مع أحد ثوابت NetworkCapabilities.NET_CAPABILITY_*.

تتضمّن ثوابت NET_CAPABILITY_* الأكثر فائدة ما يلي:

  • NET_CAPABILITY_INTERNET: تشير إلى أنّه تم إعداد الشبكة للاتصال بالإنترنت. الأمر يتعلق بالإعداد وليس القدرة الفعلية على الوصول إلى الخوادم العامة. على سبيل المثال، يمكن إعداد شبكة للوصول إلى الإنترنت ولكن تكون خاضعة لبوابة مقيدة.

    وعادةً ما توفّر شبكة الجوّال التي يوفّرها مشغّل شبكة الجوّال إمكانية INTERNET، في حين لا تتوفّر فيها عادةً شبكة Wi-Fi المحلية التي تعمل بتقنية P2P. لمعرفة إمكانية الاتصال الفعلي، راجِع NET_CAPABILITY_VALIDATED.

  • NET_CAPABILITY_NOT_METERED: تشير إلى أنّ الشبكة غير خاضعة للقياس يتم تصنيف الشبكة على أنّها تفرض تكلفة استخدام عندما يكون المستخدم حسّاسًا بسبب الاستخدام المكثف للبيانات على هذا الاتصال بسبب تكاليف مالية أو قيود على البيانات أو مشاكل متعلّقة بأداء البطارية.

  • NET_CAPABILITY_NOT_VPN: يشير إلى أن الشبكة ليست شبكة افتراضية خاصة.

  • NET_CAPABILITY_VALIDATED: تشير إلى أنّ الشبكة توفّر إمكانية الوصول الفعلي إلى الإنترنت العام عندما يتم فحصها. ولا تتمتع الشبكة خلف مدخل مقيد أو شبكة لا توفر تحليل اسم النطاق هذه الإمكانية. وهذا هو أقرب ما يمكن للنظام اكتشافه بشأن الشبكة التي توفر إمكانية الوصول، إلا أن الشبكة التي تم التحقق من صحتها لا تزال عرضة للتصفية المستندة إلى بروتوكول الإنترنت (IP) أو أن تعاني من فقدان مفاجئ في الاتصال بسبب مشاكل مثل ضعف الإشارة.

  • NET_CAPABILITY_CAPTIVE_PORTAL: يشير إلى أن الشبكة لها بوابة مقيدة عند إجراء فحص لها.

هناك إمكانات أخرى قد تهتم بها التطبيقات الأكثر تخصّصًا. لمزيد من المعلومات، اطّلِع على تعريفات المَعلمات في NetworkCapabilities.hasCapability(int).

قد تتغير إمكانات الشبكة في أي وقت. عندما يكتشف النظام بوابة مقيدة، يعرض إشعارًا يدعو المستخدم إلى تسجيل الدخول. خلال هذه الفترة، تملك الشبكة الميزتَين NET_CAPABILITY_INTERNET وNET_CAPABILITY_CAPTIVE_PORTAL وليس الإمكانية "NET_CAPABILITY_VALIDATED".

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

وبالمثل، يمكن أن تتغيّر عمليات نقل الشبكة ديناميكيًا. على سبيل المثال، يمكن للشبكة الافتراضية الخاصة إعادة ضبط نفسها لاستخدام شبكة أسرع ظهرت للتو، مثل التبديل من شبكة الجوّال إلى شبكة Wi-Fi لشبكتها الأساسية. في هذه الحالة، تفقد الشبكة وسيلة النقل TRANSPORT_CELLULAR وتحصل على وسيلة النقل TRANSPORT_WIFI مع الاحتفاظ بنقل TRANSPORT_VPN.

الاستماع إلى أحداث الشبكة

للاطّلاع على أحداث الشبكة، استخدِم فئتَي NetworkCallback مع ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback) وConnectivityManager.registerNetworkCallback(NetworkCallback). هاتان الطريقتان تخدمان أغراضًا مختلفة.

تحتوي جميع تطبيقات Android على شبكة تلقائية يحدّدها النظام. يفضّل النظام عادةً الشبكات غير المحدودة على الشبكات التي تفرض تكلفة استخدام، ويفضّل عادةً الشبكات الأبطأ.

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

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

عندما تصبح شبكة جديدة هي الشبكة التلقائية، أي اتصال جديد يفتحه التطبيق يستخدم هذه الشبكة. وفي مرحلة ما بعد ذلك، يتم إنهاء جميع الاتصالات المتبقية على الشبكة الافتراضية السابقة بالقوة. إذا كان من المهم أن يعرف التطبيق متى تتغير الشبكة الافتراضية، فإنه يسجل معاودة الاتصال بالشبكة الافتراضية على النحو التالي:

Kotlin

connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network : Network) {
        Log.e(TAG, "The default network is now: " + network)
    }

    override fun onLost(network : Network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network)
    }

    override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities)
    }

    override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties)
    }
})

Java

connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        Log.e(TAG, "The default network is now: " + network);
    }

    @Override
    public void onLost(Network network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network);
    }

    @Override
    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities);
    }

    @Override
    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties);
    }
});

عندما تصبح الشبكة الجديدة هي الشبكة التلقائية، يتلقّى التطبيق مكالمة هاتفية على الرقم onAvailable(Network) للشبكة الجديدة. نفِّذ onCapabilitiesChanged(Network,NetworkCapabilities) أو onLinkPropertiesChanged(Network,LinkProperties) أو كليهما للتفاعل بشكل مناسب مع التغييرات في إمكانية الاتصال.

بالنسبة إلى معاودة الاتصال المسجَّلة لدى registerDefaultNetworkCallback()، يعني onLost() أنّ الشبكة قد فقدت حالة كونها الشبكة التلقائية. قد يكون الجهاز غير متصل.

على الرغم من أنّه يمكنك التعرّف على وسائل النقل التي تستخدمها الشبكة التلقائية من خلال طلب البحث NetworkCapabilities.hasTransport(int)، يعتبر هذا الخادم وكيلاً ضعيفًا لمعدّل نقل البيانات أو قياس حصة الشبكة. ولا يمكن لتطبيقك افتراض أنّ شبكة Wi-Fi لا تفرض دائمًا تكلفة استخدام، وتوفر دائمًا معدّل نقل بيانات أفضل من الأجهزة الجوّالة.

بدلاً من ذلك، يمكنك استخدام NetworkCapabilities.getLinkDownstreamBandwidthKbps() لقياس معدل نقل البيانات، وNetworkCapabilites.hasCapability(int) مع NET_CAPABILITY_NOT_METERED الوسيطات لتحديد الحد الأقصى للقياس. لمزيد من المعلومات، راجِع القسم المتعلق NetworkCapabilities وLinkProperties.

ويتم تلقائيًا استدعاء طرق معاودة الاتصال في سلسلة محادثات الاتصال بتطبيقك، وهي سلسلة محادثات منفصلة يستخدمها ConnectivityManager. إذا كان تنفيذ الاستدعاءات بحاجة إلى بذل أي مجهود إضافي، يمكنك استدعائها على سلسلة تعليمات عامل منفصلة باستخدام الصيغة ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler).

يمكنك إلغاء تسجيل معاودة الاتصال عندما لا تستخدمها مرة أخرى من خلال الاتصال بالرقم ConnectivityManager.unregisterNetworkCallback(NetworkCallback). يمكنك إجراء ذلك من خلال النقر على onPause() في نشاطك الرئيسي، خاصةً إذا سجّلت معاودة الاتصال في onResume().

شبكات إضافية

على الرغم من أن الشبكة التلقائية هي الشبكة الوحيدة ذات الصلة بمعظم التطبيقات، قد تكون بعض التطبيقات مهتمة بالشبكات الأخرى المتاحة. لمعرفة ذلك، تنشئ التطبيقات NetworkRequest يتناسب مع احتياجاتها وتتصل بـ ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback).

تتشابه هذه العملية مع الاستماع إلى شبكة افتراضية. ومع ذلك، بالرغم من أنّه قد تكون هناك شبكة تلقائية واحدة فقط تنطبق على أحد التطبيقات في أي وقت، يتيح هذا الإصدار لتطبيقك الاطّلاع على جميع الشبكات المتاحة في الوقت نفسه، وبالتالي فإنّ طلب الرمز onLost(Network) يعني انقطاع اتصال الشبكة بشكل نهائي، وليس أنّها لم تعُد هي الشبكة التلقائية في الوقت الحالي.

ينشئ التطبيق NetworkRequest لإعلام ConnectivityManager بنوع الشبكات التي يريد الاستماع إليها. يوضّح المثال التالي كيفية إنشاء NetworkRequest لتطبيق مهتم فقط باتصالات الإنترنت التي لا تفرض تكلفة استخدام:

Kotlin

val request = NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build()

connectivityManager.registerNetworkCallback(request, myNetworkCallback)

Java

NetworkRequest request = new NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build();

connectivityManager.registerNetworkCallback(request, myNetworkCallback);

ويعني هذا أنّ تطبيقك يسمع عن جميع التغييرات المتعلّقة بأي شبكة لا تفرض تكلفة استخدام على النظام.

بالنسبة إلى عملية الاستدعاء التلقائية للشبكة، هناك إصدار من registerNetworkCallback(NetworkRequest, NetworkCallback, Handler) يقبل Handler لذلك لا يُحمِّل سلسلة محادثات Connectivity في تطبيقك.

يمكنك الاتصال ConnectivityManager.unregisterNetworkCallback(NetworkCallback) عندما تصبح معاودة الاتصال غير مناسبة. يمكن للتطبيق تسجيل عدة طلبات معاودة الاتصال بالشبكة بشكل متزامن.

للتيسير عليك، يحتوي الكائن NetworkRequest على الإمكانات الشائعة التي تحتاجها معظم التطبيقات، ومن بينها ما يلي:

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

على سبيل المثال، إذا كان تطبيقك يحتاج إلى إرسال رسائل وسائط متعددة، أضِف NET_CAPABILITY_MMS إلى NetworkRequest لتجنُّب إخباره بجميع الشبكات التي لا يمكنها إرسال رسائل وسائط متعددة. يمكنك الإضافة TRANSPORT_WIFI_AWARE إذا كان تطبيقك مهتمًا فقط بالاتصال بشبكة Wi-Fi من نظير لنظير (P2P). يمكنك استخدام NET_CAPABILITY_INTERNET وNET_CAPABILITY_VALIDATED إذا كنت مهتمًا بإمكانية نقل البيانات مع خادم على الإنترنت.

نموذج تسلسل معاودة الاتصال

يصف هذا القسم تسلسل عمليات معاودة الاتصال التي قد يتلقّاها التطبيق إذا كان يسجّل كلاً من معاودة الاتصال التلقائية ومعاودة الاتصال العادية على جهاز به اتصال بشبكة الجوّال. في هذا المثال، يتصل الجهاز بنقطة وصول جيدة لشبكة Wi-Fi، ثم ينقطع الاتصال بها. يفترض المثال أيضًا أن الإعداد مفعّل دائمًا على الجهاز.

يكون الجدول الزمني على النحو التالي:

  1. عندما يتصل التطبيق بـ registerNetworkCallback()، يتلقّى المُعاودة الاتصال فورًا المكالمات من onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لشبكة الجوّال، لأنّه لا تتوفّر سوى هذه الشبكة. في حال توفُّر شبكة أخرى، يتلقّى التطبيق أيضًا استدعاءات للشبكة الأخرى.

    مخطّط بياني للحالة يعرض حدث معاودة الاتصال بشبكة التسجيل وعمليات معاودة الاتصال التي تم تشغيلها بسبب الحدث
    الشكل 1. حالة التطبيق بعد الاتصال بـ registerNetworkCallback().

  2. بعد ذلك، يطلب التطبيق من "registerDefaultNetworkCallback()". تبدأ ميزة "معاودة الاتصال بالشبكة" التلقائية في تلقّي المكالمات على onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() بالنسبة إلى شبكة الجوّال، لأنّ شبكة الجوّال هي الشبكة التلقائية. في حال تشغيل شبكة أخرى غير تلقائية، لن يتمكّن التطبيق من تلقّي الاتصالات بالشبكة غير التلقائية.

    مخطّط بياني للحالة يُظهر تسجيل حدث معاودة الاتصال بالشبكة
التلقائي وعمليات معاودة الاتصال التي تم تشغيلها بواسطة الحدث
    الشكل 2. حالة التطبيق بعد تسجيل شبكة تلقائية

  3. ويتصل الجهاز لاحقًا بشبكة Wi-Fi (لا تفرض تكلفة استخدام). يتلقّى جهاز معاودة الاتصال العادي على الشبكة المكالمات إلى onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() للاتصال بشبكة Wi-Fi.

    مخطّط بياني للحالة يعرض عمليات معاودة الاتصال التي تم تشغيلها عند اتصال التطبيق بشبكة جديدة
    الشكل 3. حالة التطبيق بعد الاتصال بشبكة Wi-Fi لا تفرض تكلفة استخدام

  4. في هذه المرحلة، من الممكن أن يستغرق التحقق من شبكة Wi-Fi بعض الوقت. في هذه الحالة، لا تتضمّن طلبات onNetworkCapabilitiesChanged() لمعاودة الاتصال العادية بالشبكة الإمكانية NET_CAPABILITY_VALIDATED. وبعد فترة قصيرة، يتلقّى الهاتف مكالمة إلى onNetworkCapabilitiesChanged()، حيث تتضمّن الإمكانات الجديدة NET_CAPABILITY_VALIDATED. في معظم الحالات، يكون التحقق من الصحة سريعًا جدًا.

    عندما يتم التحقق من صحة شبكة Wi-Fi، يفضّلها النظام على شبكة الجوّال، ويرجع ذلك أساسًا إلى أنّها لا تفرض تكلفة استخدام. تصبح شبكة Wi-Fi هي الشبكة التلقائية، وبالتالي تتلقّى شبكة Wi-Fi المعاود الاتصال بالشبكة تلقائيًا طلبًا بـ onAvailable() وonNetworkCapabilitiesChanged() و onLinkPropertiesChanged() لشبكة Wi-Fi. تنتقل شبكة الجوّال إلى الخلفية، وتتلقى الشبكة العادية للاتصال اتصالاً بـ onLosing() لشبكة الجوّال.

    نظرًا لأن هذا المثال يفترض أن بيانات الجوّال مفعّلة دائمًا على هذا الجهاز، لا يتم قطع اتصال شبكة الجوّال أبدًا. إذا كان الإعداد غير مفعَّل، وبعد فترة من الوقت، سينقطع الاتصال بشبكة الجوّال، ويتلقّى المتلقّي العادي للاتصال بالشبكة اتصالاً على onLost().

    رسم بياني للحالة يعرض استدعاءات الشبكة التي تم بدؤها عند التحقق من صحة اتصال شبكة Wi-Fi
    الشكل 4. حالة التطبيق بعد التحقُّق من شبكة Wi-Fi.

  5. في وقت لاحق، انقطع اتصال الجهاز بشبكة Wi-Fi فجأةً، لأنه خارج النطاق. بسبب انقطاع الاتصال بشبكة Wi-Fi، تتلقّى المعاودات الاتصال بالشبكة العادية مكالمة إلى onLost() للاتصال بشبكة Wi-Fi. نظرًا لأن الجوّال هو الشبكة التلقائية الجديدة، فإن شبكة الاتصال التلقائية تتلقى المكالمات على onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لشبكة الجوّال.

    رسم بياني للحالة يُظهر استدعاءات شبكة Wi-Fi التي تم بدؤها عند فقدان الاتصال بشبكة Wi-Fi
    الشكل 5. حالة التطبيق بعد قطع الاتصال بشبكة Wi-Fi.

إذا كان الإعداد تفعيل بيانات الجوّال دائمًا غير مفعّل، يحاول الجهاز إعادة الاتصال بشبكة الجوّال عند انقطاع الاتصال بشبكة Wi-Fi. تبدو الصورة مماثلة، ولكن مع تأخير إضافي لفترة قصيرة، عند تلقّي مكالمات onAvailable()، كما تتلقّى المكالمات العادية عبر الشبكة أيضًا المكالمات على onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لأنّ الأجهزة الجوّالة أصبحت متاحة.

القيود المفروضة على استخدام الشبكة لنقل البيانات

إنّ القدرة على رؤية شبكة تتضمن معاودة الاتصال بالشبكة لا تعني أنّ تطبيقك يمكنه استخدام الشبكة لنقل البيانات. بعض الشبكات لا توفّر إمكانية الاتصال بالإنترنت، وقد تقتصر بعض الشبكات على التطبيقات المميزة. للتحقّق من الاتصال بالإنترنت، يمكنك الاطّلاع على NET_CAPABILITY_INTERNET وNET_CAPABILITY_VALIDATED.

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

إنّ التطبيقات التي لديها هذا الإذن تسمح للنظام بمحاولة إظهار شبكة غير متوفِّرة، مثل شبكة الجوّال، عندما يكون الجهاز متصلاً بشبكة Wi-Fi. يطلب هذا التطبيق استخدام ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) مع NetworkCallback عند طلب الشبكة.