يتيح 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(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
إذا كان تطبيقك مهتمًا فقط باتصال P2P بشبكة 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 هي الشبكة التلقائية، وبالتالي تتلقّى شبكة 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
ليتم الاتصال به عند جلب الشبكة.