يتيح 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
يوفّر العنصران 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. يمكن للشبكة التي تتوفّر فيها ميزة رسائل الوسائط المتعددة إرسال
وتلقّي رسائل الوسائط المتعددة، ولا يمكن للشبكة التي لا تتوفّر فيها هذه
الميزة إجراء ذلك. لا تفرض الشبكة التي تتضمّن ميزة NOT_METERED رسومًا على المستخدم مقابل البيانات. يمكن لتطبيقك التحقّق من الإمكانات المناسبة باستخدام طريقة
NetworkCapabilities.hasCapability(int)
مع أحد ثوابت NetworkCapabilities.NET_CAPABILITY_*.
تشمل ثوابت NET_CAPABILITY_* الأكثر فائدة ما يلي:
NET_CAPABILITY_INTERNET: يشير إلى أنّه تم إعداد الشبكة للوصول إلى الإنترنت. يتعلّق هذا الأمر بالإعداد وليس بالقدرة الفعلية على الوصول إلى الخوادم العامة. على سبيل المثال، يمكن إعداد شبكة للوصول إلى الإنترنت ولكنها تخضع لمدخل مشروط الوصول إليه.تتوفّر إمكانية
INTERNETعادةً في شبكة الجوّال التابعة لمشغّل شبكة الجوّال، بينما لا تتوفّر عادةً في شبكة Wi-Fi محلية من نظير إلى نظير. للاطّلاع على إمكانية الاتصال الفعلية، يُرجى مراجعة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.
وبالمثل، يمكن أن تتغيّر عمليات نقل الشبكة ديناميكيًا.
على سبيل المثال، يمكن لشبكة VPN إعادة ضبط نفسها لاستخدام
شبكة أسرع أصبحت متاحة، مثل التبديل من شبكة الجوّال إلى شبكة Wi-Fi
لشبكتها الأساسية. في هذه الحالة، تفقد الشبكة وسيلة النقل TRANSPORT_CELLULAR وتكتسب وسيلة النقل TRANSPORT_WIFI، مع الاحتفاظ بوسيلة النقل TRANSPORT_VPN.
الاستماع إلى أحداث الشبكة
للاطّلاع على أحداث الشبكة، استخدِم الفئة
NetworkCallback
مع
ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback)
و
ConnectivityManager.registerNetworkCallback(NetworkCallback). تخدم هاتان الطريقتان
أغراضًا مختلفة.
تحتوي جميع تطبيقات Android على شبكة تلقائية يحدّدها النظام. يفضّل النظام عادةً الشبكات التي لا تفرض تكلفة استخدام على الشبكات التي تفرض تكلفة استخدام، والشبكات الأسرع على الشبكات الأبطأ.
عندما يُصدر تطبيق طلب شبكة، مثل
HttpsURLConnection، يستجيب النظام لهذا الطلب باستخدام الشبكة التلقائية. ويمكن للتطبيقات إرسال الزيارات
على شبكات أخرى أيضًا. لمزيد من المعلومات، يُرجى الاطّلاع على القسم حول الشبكات الإضافية.
يمكن أن تتغيّر الشبكة التي تم ضبطها كشبكة تلقائية في أي وقت خلال فترة استخدام التطبيق. ومن الأمثلة الشائعة على ذلك دخول الجهاز في نطاق نقطة وصول لاسلكية معروفة ونشطة ولا تفرض تكلفة استخدام وأسرع من شبكة الجوّال. يتصل الجهاز بنقطة الوصول هذه ويبدّل الشبكة التلقائية لجميع التطبيقات إلى شبكة 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 من نظير إلى نظير.
NET_CAPABILITY_INTERNET وNET_CAPABILITY_VALIDATED مفيدان إذا كنت مهتمًا بإمكانية نقل البيانات باستخدام خادم على الإنترنت.
نموذج تسلسل معاودة الاتصال
يصف هذا القسم تسلسل عمليات الاستدعاء التي قد يتلقّاها التطبيق إذا سجّل كلاً من عملية استدعاء تلقائية وعملية استدعاء عادية على جهاز يتصل بشبكة الجوّال. في هذا المثال، يتصل الجهاز بنقطة وصول لاسلكية جيدة، ثم ينقطع الاتصال بها. يفترض المثال أيضًا أنّ الجهاز تم تفعيل إعداد بيانات الجوّال مفعّلة دائمًا عليه.
في ما يلي المخطط الزمني:
عندما يستدعي التطبيق
registerNetworkCallback()، يتلقّى ردّ الاتصال على الفور مكالمات منonAvailable()وonNetworkCapabilitiesChanged()وonLinkPropertiesChanged()لشبكة الجوّال، لأنّ هذه الشبكة هي الوحيدة المتاحة. وإذا كانت هناك شبكة أخرى متاحة، يتلقّى التطبيق أيضًا عمليات استدعاء للشبكة الأخرى.
الشكل 1: حالة التطبيق بعد استدعاءregisterNetworkCallback().بعد ذلك، يستدعي التطبيق
registerDefaultNetworkCallback(). تبدأ دالة الاستدعاء التلقائية للشبكة في تلقّي طلبات لـonAvailable()وonNetworkCapabilitiesChanged()وonLinkPropertiesChanged()لشبكة الجوّال، لأنّ شبكة الجوّال هي الشبكة التلقائية. وإذا كانت هناك شبكة أخرى غير تلقائية قيد التشغيل، لن يتمكّن التطبيق من تلقّي المكالمات من الشبكة غير التلقائية.
الشكل 2: حالة التطبيق بعد تسجيل شبكة تلقائيةبعد ذلك، يتصل الجهاز بشبكة Wi-Fi (لا تفرض تكلفة استخدام). تتلقّى دالة الاستدعاء العادية للشبكة طلبات إلى
onAvailable()وonNetworkCapabilitiesChanged()وonLinkPropertiesChanged()لشبكة Wi-Fi.
الشكل 3: حالة التطبيق بعد الاتصال بشبكة Wi-Fi لا تفرض تكلفة استخدامفي هذه المرحلة، من المحتمل أن يستغرق التحقّق من صحة شبكة Wi-Fi بعض الوقت. في هذه الحالة، لا تتضمّن طلبات
onNetworkCapabilitiesChanged()لعمليات معاودة الاتصال العادية بالشبكة الميزةNET_CAPABILITY_VALIDATED. وبعد فترة قصيرة، يتلقّى الجهاز مكالمة على الرقمonNetworkCapabilitiesChanged()، حيث تشمل الإمكانات الجديدةNET_CAPABILITY_VALIDATED. في معظم الحالات، تكون عملية التحقّق سريعة جدًا.عندما يتم التحقّق من شبكة Wi-Fi، يفضّلها النظام على شبكة الجوّال، ويرجع ذلك بشكل أساسي إلى أنّها لا تفرض تكلفة استخدام. تصبح شبكة Wi-Fi هي الشبكة التلقائية، وبالتالي تتلقّى دالة الاستدعاء للشبكة التلقائية طلبًا إلى
onAvailable()وonNetworkCapabilitiesChanged()وonLinkPropertiesChanged()لشبكة Wi-Fi. تنتقل شبكة الجوّال إلى الخلفية، وتتلقّى دالة الاستدعاء العادية للشبكة استدعاءً إلىonLosing()لشبكة الجوّال.يفترض هذا المثال أنّ بيانات الجوّال مفعّلة دائمًا على هذا الجهاز، لذا لا يتم قطع اتصال شبكة الجوّال أبدًا. إذا كان الإعداد غير مفعّل، سيتم قطع الاتصال بشبكة الجوّال بعد فترة، وستتلقّى دالة الاستدعاء العادية للشبكة طلبًا إلى
onLost().
الشكل 4: حالة التطبيق بعد التحقّق من شبكة Wi-Fiبعد ذلك، ينقطع اتصال الجهاز فجأة بشبكة Wi-Fi، لأنه خرج عن النطاق. بسبب انقطاع اتصال Wi-Fi، تتلقّى دالة الاستدعاء العادية للشبكة طلبًا إلى
onLost()لشبكة Wi-Fi. بما أنّ شبكة الجوّال هي الشبكة التلقائية الجديدة، تتلقّى دالة الاستدعاء التلقائية للشبكة طلبات إلىonAvailable()وonNetworkCapabilitiesChanged()وonLinkPropertiesChanged()لشبكة الجوّال.
الشكل 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 ليتم استدعاؤه عند تشغيل الشبكة.