يتيح نظام التشغيل Android للتطبيقات معرفة التغييرات الديناميكية في الاتصال. استخدِم الفئات التالية لتتبُّع تغييرات الاتصال والاستجابة لها:
ConnectivityManager
يُعلم هذا الإذن تطبيقك بحالة الاتصال في النظام.- تمثّل فئة
Network
إحدى الشبكات التي يتصل بها الجهاز. يمكنك استخدامNetwork
كمفتاح لجمع معلومات عن الشبكة باستخدامConnectivityManager
أو لربط مآخذ التوصيل على الشبكة. عند انقطاع اتصال الشبكة، يتوقف استخدام عنصرNetwork
. حتى إذا أعدّ الجهاز لاحقًا الاتصال بالجهاز نفسه، يمثّل عنصرNetwork
الجديد الشبكة الجديدة. - يحتوي عنصر
LinkProperties
على معلومات عن رابط الشبكة، مثل قائمة عناوين IP المحلية وخوادم DNS ومسارات الشبكة المثبَّتة للشبكة. - يحتوي العنصر
NetworkCapabilities
على معلومات حول خصائص الشبكة، مثل وسائل النقل (Wi-Fi والأجهزة الجوّالة والبلوتوث) والميزات التي توفّرها الشبكة. على سبيل المثال، يمكنك طلب معلومات عن العنصر لتحديد ما إذا كانت الشبكة قادرة على إرسال رسائل MMS أو كانت خلف مدخل مشروط الوصول إليه أو كانت مُحصَّلة.
يمكن للتطبيقات المهتمة بمعرفة حالة الاتصال الفورية في أي وقت
استدعاء طرق 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 معروفة ونشطة وغير محدودة السرعة وتكون أسرع من شبكة الجوّال. يتصل الجهاز بنقطة الوصول هذه ويبدِّل الشبكة التلقائية لجميع التطبيقات إلى شبكة Wi-Fi الجديدة.
عندما تصبح شبكة جديدة هي الشبكة التلقائية، يستخدم التطبيق هذه الشبكة عند فتح أي اتصال جديد. في وقت لاحق، يتم إنهاء جميع عمليات الربط المتبقية على الشبكة التلقائية السابقة بشكل قسري. إذا كان من المهم أن يعرف التطبيق عند تغيُّر الشبكة التلقائية، يسجِّل callback للشبكة التلقائية على النحو التالي:
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
لتطبيق لا يهتم إلا بعمليات اتصال internet
غير المحدودة:
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)
عندما لا تكون المكالمة المُعاد توجيهها ذات صلة بعد الآن. يمكن للتطبيق تسجيل callbacks متعددة للشبكة بشكل متزامن.
لتسهيل الأمر عليك، يحتوي عنصر
NetworkRequest
على
الإمكانات الشائعة التي تحتاجها معظم التطبيقات، بما في ذلك ما يلي:
عند كتابة تطبيقك، تحقّق من الإعدادات التلقائية لمعرفة ما إذا كانت تتطابق مع حالة الاستخدام التي تتعامل معها، وأزِلها إذا كنت تريد أن يتلقّى تطبيقك إشعارات بشأن الشبكات التي لا تتضمّن هذه الإمكانات. من ناحية أخرى، أضِف إمكانات لتجنُّب تلقّي إشعارات بشأن أي تغيير في الاتصال بالشبكات التي لا يتفاعل معها تطبيقك.
على سبيل المثال، إذا كان تطبيقك يحتاج إلى إرسال رسائل وسائط متعددة، أضِف
NET_CAPABILITY_MMS
إلى NetworkRequest
لتجنُّب تلقّي إشعارات بشأن جميع الشبكات التي لا يمكنها
إرسال رسائل وسائط متعددة. أضِف TRANSPORT_WIFI_AWARE
إذا كان تطبيقك مهتمًا فقط بالاتصال عبر شبكة Wi-Fi بين الأجهزة.
NET_CAPABILITY_INTERNET
و
NET_CAPABILITY_VALIDATED
هما مفيدان إذا كنت مهتمًا بنقل البيانات باستخدام خادم
على الإنترنت.
نموذج تسلسل معاودة الاتصال
يوضّح هذا القسم تسلسل عمليات الاستدعاء التي قد يتلقّاها التطبيق إذا كان مسجّلاً لكلّ من استدعاء تلقائي واستدعاء عادي على جهاز يتصل بالشبكة الجوّالة. في هذا المثال، يتصل الجهاز بأحد نقاط الوصول الجيدة إلى شبكة Wi-Fi، ثم ينقطع الاتصال بها. يفترض المثال أيضًا أنّه تم تفعيل الإعداد بيانات الجوّال مفعّلة دائمًا على الجهاز.
في ما يلي المخطط الزمني:
عندما يتصل التطبيق بالرقم
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
ليتم الاتصال به عند إنشاء الشبكة.