قراءة حالة الشبكة

يتيح نظام التشغيل 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، ثم يتم فصله عنها. يفترض المثال أيضًا أنّ الجهاز يفعّل الإعداد بيانات الجوّال نشطة دائمًا.

في ما يلي المخطط الزمني:

  1. عندما يستدعي التطبيق registerNetworkCallback()، تتلقّى الدالة رد الاتصال على الفور مكالمات من onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لشبكة الجوّال، لأنّ هذه الشبكة فقط هي المتاحة. في حال توفّر شبكة أخرى، يتلقّى التطبيق أيضًا عمليات ردّ لطلبات الشبكة الأخرى.

    مخطّط حالة يعرض حدث معاودة الاتصال بشبكة التسجيل وعمليات معاودة الاتصال التي يتم تشغيلها بواسطة الحدث
    الشكل 1. حالة التطبيق بعد الاتصال برقم registerNetworkCallback()

  2. بعد ذلك، يستدعي التطبيق registerDefaultNetworkCallback(). يبدأ الإجراء الاحتياطي التلقائي للشبكة في تلقّي طلبات إلى onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لشبكة الجوّال، لأنّ شبكة الجوّال هي الشبكة التلقائية. إذا كانت هناك شبكة أخرى غير تلقائية نشطة، لن يتمكّن التطبيق من تلقّي المكالمات على الشبكة غير التلقائية.

    مخطّط الحالة الذي يعرض حدث تسجيل عملية ردّ الاتصال التلقائية بالشبكة وعمليات ردّ الاتصال التي يتم تشغيلها بواسطة الحدث
    الشكل 2. حالة التطبيق بعد تسجيل شبكة تلقائية

  3. في وقت لاحق، يتصل الجهاز بشبكة Wi-Fi (غير محدودة الاستخدام). يتلقّى برنامج معالجة المكالمات العادية على الشبكة مكالمات إلى onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لشبكة Wi-Fi.

    مخطّط حالة يعرض عمليات الرجوع التي يتم تشغيلها عندما يتصل التطبيق بشبكة جديدة
    الشكل 3. حالة التطبيق بعد الاتصال بشبكة Wi-Fi غير محدودة الاستخدام

  4. في هذه المرحلة، من المحتمل أن تستغرق شبكة Wi-Fi بعض الوقت للتحقّق من صحتها. في هذه الحالة، لا تتضمّن طلبات onNetworkCapabilitiesChanged() لرد الاتصال العادي بالشبكة الميزة NET_CAPABILITY_VALIDATED. بعد فترة قصيرة، يتلقّى طلبًا إلى onNetworkCapabilitiesChanged()، حيث تتضمّن الإمكانات الجديدة NET_CAPABILITY_VALIDATED. في معظم الحالات، تتم عملية التحقّق بسرعة كبيرة.

    عندما يتم التحقّق من صحة شبكة Wi-Fi، يفضِّل النظام استخدامها على شبكة الجوّال، ويرجع ذلك بشكل أساسي إلى أنّها غير خاضعة لقيود الاستخدام. تصبح شبكة Wi-Fi هي الشبكة التلقائية، وبالتالي يتلقّى برنامج معالجة الشبكة التلقائية طلبًا إلى onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لشبكة Wi-Fi. تنتقل شبكة الجوّال إلى الخلفية، ويتلقّى برنامج معالجة المكالمات العادي مكالمة إلى onLosing() لشبكة الجوّال.

    بما أنّ هذا المثال يفترض أنّ بيانات الجوّال تكون مفعّلة دائمًا على هذا الجهاز، لن يتم قطع الاتصال بشبكة الجوّال مطلقًا. إذا كان الإعداد غير مفعّل، سيتم قطع الاتصال بشبكة الجوّال بعد فترة، وسيتلقّى برنامج معالجة المكالمات العادي على الشبكة مكالمة إلى onLost().

    مخطط حالة يعرض عمليات معاودة الاتصال التي يتم تشغيلها عند إثبات صحة اتصال بشبكة Wi-Fi
    الشكل 4. حالة التطبيق بعد أن تتحقّق شبكة Wi-Fi من صحة بياناته

  5. بعد ذلك، ينقطع اتصال الجهاز بشبكة Wi-Fi فجأة بسبب خروجه عن نطاق الشبكة. بما أنّ شبكة Wi-Fi تنقطع، يتلقّى الردّ العادي من الشبكة طلبًا إلى onLost() بشأن شبكة Wi-Fi. بما أنّ شبكة الجوّال هي الشبكة التلقائية الجديدة، يتلقّى برنامج معالجة البيانات التابع للشبكة التلقائية طلبات إلى onAvailable() وonNetworkCapabilitiesChanged() وonLinkPropertiesChanged() لشبكة الجوّال.

    مخطط حالة يعرض عمليات معاودة الاتصال التي يتم تشغيلها عند فقدان الاتصال بشبكة Wi-Fi
    الشكل 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 يتم استدعاؤه عند إعداد الشبكة.