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

يتيح نظام التشغيل Android للتطبيقات التعرّف على التغييرات الديناميكية في الاتصال. استخدِم الفئات التالية لتتبُّع التغييرات في الاتصال والاستجابة لها:

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

يوفّر العنصران 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 الجديدة.

عندما تصبح شبكة جديدة هي الشبكة التلقائية، سيستخدم التطبيق هذه الشبكة في أي اتصال جديد يفتحه. في وقت لاحق، يتم إنهاء جميع عمليات الربط المتبقية على الشبكة التلقائية السابقة بشكل إجباري. إذا كان من المهم أن يعرف التطبيق متى تتغير الشبكة التلقائية، يسجّل التطبيق عملية ردّ الاتصال الخاصة بالشبكة التلقائية على النحو التالي:

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. إذا كان تنفيذ عمليات معاودة الاتصال يتطلّب إجراء أي عمل أطول، يمكنك استدعاؤها في سلسلة الوحدات العاملة (worker thread) منفصلة باستخدام الصيغة 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 مفيدَين إذا كنت مهتمًا بإمكانية نقل البيانات باستخدام خادم على الإنترنت.

نموذج تسلسل معاودة الاتصال

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

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

  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 ليتم استدعاؤه عند إعداد الشبكة.