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