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

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

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

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

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

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

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

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

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

تصف الإمكانية خاصية من خصائص الشبكة. وتشمل أمثلة الإمكانات MMS وNOT_METERED وINTERNET. ويمكن للشبكة التي تتضمن إمكانية رسائل الوسائط المتعددة (MMS) إرسال رسائل خدمة الوسائط المتعددة وتلقيها، ولا يمكن للشبكة التي لا تتضمن هذه القدرة إرسال الرسائل. ويُرجى العِلم أنّ الشبكة التي تتضمّن إمكانية "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(NET_CAPABILITY_INTERNET)
  .build()

connectivityManager.registerNetworkCallback(request, myNetworkCallback)

Java

NetworkRequest request = new NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(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 إذا كان تطبيقك مهتمًا فقط باتصال P2P بشبكة Wi-Fi. يمكن استخدام الترميزَين 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
    الشكل 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 ليتم الاتصال به عند جلب الشبكة.