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

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

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

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

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 بين الأجهزة. 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 ليتم الاتصال به عند إنشاء الشبكة.