يتيح نظام التشغيل Android للتطبيقات معرفة التغييرات الديناميكية في الاتصال. استخدِم الفئات التالية لتتبُّع تغييرات الاتصال والاستجابة لها:
ConnectivityManager
يُعلم هذا الإذن تطبيقك بحالة الاتصال في النظام.- تمثّل فئة
Network
إحدى الشبكات التي يتصل بها الجهاز. يمكنك استخدام الكائنNetwork
كمفتاح لجمع معلومات عن الشبكة من خلال "ConnectivityManager
" أو لربط المقابس على الشبكة. عند انقطاع الاتصال بالشبكة، يتوقف عنصرNetwork
عن قابلية الاستخدام. حتى إذا أعدّ الجهاز لاحقًا الاتصال بالجهاز نفسه، يمثّل عنصرNetwork
الجديد الشبكة الجديدة. - يحتوي عنصر
LinkProperties
على معلومات عن رابط الشبكة، مثل قائمة عناوين IP لخادمات DNS وعناوين IP المحلية ومسارات الشبكة المثبَّتة للشبكة. - يحتوي العنصر
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 والجهاز الجوّال.
كما يمكن أن تكون الشبكات الافتراضية الخاصة وشبكات 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 الجديدة.
عندما تصبح شبكة جديدة هي الشبكة التلقائية، يستخدم التطبيق هذه الشبكة عند فتح أي اتصال جديد. في وقت لاحق، يتم إنهاء جميع عمليات الربط المتبقية على الشبكة التلقائية السابقة بشكل قسري. إذا كان من المهم أن يعرف التطبيق متى تتغير الشبكة الافتراضية، فإنه يسجِّل معاودة الاتصال بالشبكة التلقائية على النحو التالي:
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 من نظير لنظير (P2P).
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
عند طلب الشبكة.