خواندن وضعیت شبکه

Android به برنامه‌ها امکان می‌دهد از تغییرات پویا در اتصال مطلع شوند. از کلاس‌های زیر برای ردیابی و پاسخ به تغییرات اتصال استفاده کنید:

  • ConnectivityManager وضعیت اتصال در سیستم را به برنامه شما اطلاع می‌دهد.
  • کلاس Network نشان‌دهنده یکی از شبکه‌هایی است که دستگاه به آن متصل است. می‌توانید از شیء Network به‌عنوان کلیدی برای جمع‌آوری اطلاعات درباره شبکه با ConnectivityManager یا برای مقید کردن سوکت‌ها در شبکه استفاده کنید. وقتی شبکه قطع می‌شود، شیء Network دیگر قابل‌استفاده نیست. حتی اگر دستگاه بعداً دوباره به همان وسیله متصل شود، شیء Network جدیدی نشان‌دهنده شبکه جدید است.
  • شیء LinkProperties حاوی اطلاعاتی درباره پیوند شبکه است، مانند فهرست سرورهای DNS، نشانی‌های IP محلی، و مسیرهای شبکه نصب‌شده برای شبکه.
  • شیء NetworkCapabilities حاوی اطلاعاتی درباره ویژگی‌های شبکه است، ازجمله انتقال‌ها (Wi-Fi، تلفن همراه، بلوتوث) و قابلیت‌های شبکه. برای مثال، می‌توانید شیء را پرسمان کنید تا مشخص شود آیا شبکه قادر به ارسال فراپیام است، پشت درگاه مهمان قرار دارد، یا شبکه‌ای با هزینه براساس مصرف است.

برنامه‌هایی که به وضعیت فوری اتصال در هر زمان مشخصی نیاز دارند می‌توانند روش‌های ConnectivityManager را فراخوانی کنند تا متوجه شوند چه نوع شبکه‌ای دردسترس است. این روش‌ها برای اشکال‌زدایی و گاهی برای مرور عکس آنی اتصال دردسترس در هر زمان مشخص مفید هستند.

اما روش‌های همگام ConnectivityManager به برنامه شما درباره اتفاقاتی که پس‌از تماس می‌افتد اطلاع نمی‌دهند، بنابراین به شما اجازه نمی‌دهند میانای کاربر را به‌روز کنید. همچنین نمی‌توانند رفتار برنامه را براساس قطع شدن شبکه یا تغییر قابلیت‌های شبکه تنظیم کنند.

اتصال‌پذیری می‌تواند در هر زمانی تغییر کند و اکثر برنامه‌ها باید نمایی همیشه تازه و به‌روز از وضعیت شبکه‌سازی در دستگاه داشته باشند. برنامه‌ها می‌توانند یک فراخوانی برگشتی را با ConnectivityManager ثبت کنند تا از تغییراتی که برای برنامه مهم است مطلع شوند. بااستفاده از فراخوانی برگشتی، برنامه شما می‌تواند فوراً به هرگونه تغییر مربوطه در اتصال واکنش نشان دهد، بدون اینکه مجبور باشد به نظرسنجی‌های پرهزینه متوسل شود که ممکن است به‌روزرسانی‌های سریع را ازدست بدهد.

استفاده از NetworkCallback و روش‌های دیگر برای اطلاع از وضعیت اتصال دستگاه به هیچ اجازه خاصی نیاز ندارد. بااین‌حال، برخی‌از شبکه‌ها مشمول اجازه‌های خاصی هستند. برای مثال، ممکن است شبکه‌های محدودی وجود داشته باشد که برای برنامه‌ها دردسترس نباشد. اتصال به شبکه پس‌زمینه به اجازه CHANGE_NETWORK_STATE نیاز دارد. و برخی‌از فراخوانی‌ها ممکن است برای اجرا به اجازه‌های خاصی نیاز داشته باشند. برای جزئیات، به اسناد خاص هر تماس مراجعه کنید.

دریافت وضعیت لحظه‌ای

دستگاه Android می‌تواند چندین اتصال را به‌طور هم‌زمان حفظ کند. برای دریافت اطلاعات درباره وضعیت فعلی شبکه، ابتدا نمونه‌ای از ConnectivityManager را دریافت کنید:

val connectivityManager = getSystemService(ConnectivityManager::class.java)

سپس، از این نمونه برای دریافت مرجع به شبکه پیش‌فرض فعلی برای برنامه‌تان استفاده کنید:

val currentNetwork = connectivityManager.activeNetwork

با ارجاع به شبکه، برنامه‌تان می‌تواند اطلاعاتی درباره آن درخواست کند:

val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
val linkProperties = connectivityManager.getLinkProperties(currentNetwork)

برای عملکرد مفیدتر، NetworkCallback ثبت کنید. برای اطلاعات بیشتر درباره ثبت تماس‌های برگشتی شبکه، به گوش دادن به رویدادهای شبکه مراجعه کنید.

NetworkCapabilities و LinkProperties

اشیاء NetworkCapabilities و LinkProperties اطلاعاتی درباره همه مشخصه‌هایی که سیستم درباره شبکه می‌داند ارائه می‌دهند.

شیء LinkProperties از مسیرها، نشانی‌های پیوند، نام میانای، اطلاعات پراکسی (درصورت وجود)، و سرورهای ساناد مطلع است. برای بازیابی اطلاعات موردنیازتان، روش مربوطه را در شیء LinkProperties فراخوانی کنید.

شیء NetworkCapabilities اطلاعات مربوط به انتقال‌های شبکه و قابلیت‌های آن‌ها را کپسوله‌سازی می‌کند.

حمل‌ونقل انتزاعی از رسانه فیزیکی است که شبکه روی آن کار می‌کند. نمونه‌های رایج انتقال عبارت‌اند از اترنت، Wi-Fi، و تلفن همراه. وی‌پی‌ان‌ها و 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: نشان می‌دهد که شبکه 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 جدید تغییر می‌دهد.

وقتی شبکه جدیدی پیش‌فرض می‌شود، هر اتصال جدیدی که برنامه باز می‌کند از این شبکه استفاده می‌کند. در زمانی بعدتر، همه اتصال‌های باقی‌مانده در شبکه پیش‌فرض قبلی به‌اجبار قطع می‌شوند. اگر برای برنامه مهم باشد که بداند چه زمانی شبکه پیش‌فرض تغییر می‌کند، یک فراخوان شبکه پیش‌فرض را به‌صورت زیر ثبت می‌کند:

val defaultNetworkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        Log.d(TAG, "The default network is now: $network")
    }

    override fun onLost(network: Network) {
        Log.d(
            TAG,
            "The application no longer has a default network. " +
                "The last default network was $network"
        )
    }

    override fun onCapabilitiesChanged(
        network: Network,
        networkCapabilities: NetworkCapabilities
    ) {
        Log.d(TAG, "The default network changed capabilities: $networkCapabilities")
    }

    override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
        Log.d(TAG, "The default network changed link properties: $linkProperties")
    }
}
connectivityManager.registerDefaultNetworkCallback(defaultNetworkCallback)

وقتی شبکه جدیدی پیش‌فرض می‌شود، برنامه تماسی برای 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 از آن استفاده می‌کند. اگر پیاده‌سازی شما از callbackها نیاز به انجام کار طولانی‌تری دارد، آن‌ها را در یک رشته عامل جداگانه بااستفاده از نوع ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) فراخوانی کنید.

وقتی دیگر به تماس برگشتی نیاز ندارید، با فراخوانی ConnectivityManager.unregisterNetworkCallback(NetworkCallback)، ثبت‌نام آن را لغو کنید. onPause() فعالیت اصلی شما مکان خوبی برای انجام این کار است، به‌ویژه اگر فراخوانی برگشتی را در onResume() ثبت کنید.

شبکه‌های بیشتر (موارد استفاده پیشرفته)

اگرچه شبکه پیش‌فرض تنها شبکه مرتبط برای اکثر برنامه‌ها است، برخی برنامه‌ها ممکن است به سایر شبکه‌های دردسترس علاقه‌مند باشند. برای اطلاع از این موارد، برنامه‌ها NetworkRequest را مطابق با نیازهایشان می‌سازند و ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback) را فراخوانی می‌کنند.

این فرایند شبیه گوش دادن به شبکه پیش‌فرض است. اما، اگرچه ممکن است در هر زمان فقط یک شبکه پیش‌فرض برای برنامه اعمال شود، این نسخه به برنامه شما اجازه می‌دهد همه شبکه‌های دردسترس را به‌طور هم‌زمان ببیند، بنابراین تماس با onLost(Network) به این معنی است که شبکه برای همیشه قطع شده است، نه اینکه دیگر پیش‌فرض نیست.

برنامه یک NetworkRequest می‌سازد تا به ConnectivityManager اطلاع دهد که می‌خواهد به چه نوع شبکه‌هایی گوش دهد. مثال زیر نشان می‌دهد که چگونه یک NetworkRequest برای برنامه‌ای که فقط به اتصالات اینترنت نامحدود علاقه دارد، بسازید:

val request = 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 اضافه کنید تا از مطلع شدن درباره همه شبکه‌هایی که نمی‌توانند پیام چندرسانه‌ای ارسال کنند اجتناب شود. اگر برنامه‌تان فقط به اتصال Wi-Fi همتا به همتا نیاز دارد، TRANSPORT_WIFI_AWARE را اضافه کنید. NET_CAPABILITY_INTERNET و NET_CAPABILITY_VALIDATED اگر به توانایی انتقال داده با سرور در اینترنت علاقه دارید، مفید هستند.

نمونه توالی پاسخ تماس

این بخش توالی فراخوانی‌های برگشتی را که ممکن است برنامه دریافت کند شرح می‌دهد، اگر هم فراخوانی برگشتی پیش‌فرض و هم فراخوانی برگشتی معمولی را در دستگاهی که اتصال تلفن همراه دارد ثبت کند. در این مثال، دستگاه به نقطه دسترسی Wi-Fi خوبی متصل می‌شود، سپس اتصالش را با آن قطع می‌کند. همچنین در این مثال فرض می‌شود که تنظیم داده تلفن همراه همیشه روشن در دستگاه فعال است.

خط زمان به‌صورت زیر است:

  1. وقتی برنامه با registerNetworkCallback() تماس می‌گیرد، تماس برگشتی بلافاصله تماس‌هایی از onAvailable()، onNetworkCapabilitiesChanged()، و onLinkPropertiesChanged() برای شبکه تلفن همراه دریافت می‌کند، زیرا فقط آن شبکه دردسترس است. اگر شبکه دیگری دردسترس باشد، برنامه فراخوانی‌های برگشتی را برای شبکه دیگر نیز دریافت می‌کند.

    نمودار وضعیت که رویداد فراخوانی برگشتی شبکه ثبت و فراخوانی‌های برگشتی را که توسط رویداد راه‌اندازی شده‌اند نشان می‌دهد
    شکل ۱. وضعیت برنامه پس‌از فراخوانی registerNetworkCallback().

  2. سپس، برنامه registerDefaultNetworkCallback() را فراخوانی می‌کند. فراخوانی برگشتی شبکه پیش‌فرض شروع به دریافت تماس‌ها به onAvailable()، onNetworkCapabilitiesChanged()، و onLinkPropertiesChanged() برای شبکه تلفن همراه می‌کند، زیرا شبکه تلفن همراه شبکه پیش‌فرض است. اگر شبکه غیرپیش‌فرض دیگری فعال باشد، برنامه نمی‌تواند تماس‌های شبکه غیرپیش‌فرض را دریافت کند.

    نمودار وضعیت که رویداد فراخوانی برگشتی شبکه پیش‌فرض ثبت‌شده و فراخوانی‌های برگشتی را که توسط رویداد راه‌اندازی شده‌اند نشان می‌دهد
    شکل ۲. وضعیت برنامه پس‌از ثبت شبکه پیش‌فرض.

  3. بعداً، دستگاه به شبکه Wi-Fi (نامحدود) متصل می‌شود. پاسخ تماس شبکه معمولی تماس‌های onAvailable()، onNetworkCapabilitiesChanged()، و onLinkPropertiesChanged() را برای شبکه Wi-Fi دریافت می‌کند.

    نمودار وضعیت که نشان می‌دهد وقتی برنامه به شبکه جدیدی متصل می‌شود، فراخوانی‌های برگشتی راه‌اندازی می‌شود
    شکل ۳. وضعیت برنامه پس‌از اتصال به شبکه 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 راه‌اندازی می‌شوند
    شکل ۴. وضعیت برنامه پس‌از اعتبارسنجی شبکه Wi-Fi.

  5. کمی بعد، اتصال دستگاه از Wi-Fi به‌طور ناگهانی قطع می‌شود، زیرا از محدوده خارج شده است. چون اتصال Wi-Fi قطع می‌شود، فراخوانی برگشتی شبکه معمولی تماسی با onLost() برای Wi-Fi دریافت می‌کند. چون شبکه تلفن همراه شبکه پیش‌فرض جدید است، فراخوان شبکه پیش‌فرض تماس‌های onAvailable()، onNetworkCapabilitiesChanged()، و onLinkPropertiesChanged() را برای شبکه تلفن همراه دریافت می‌کند.

    نمودار وضعیت که نشان می‌دهد وقتی اتصال شبکه Wi-Fi قطع می‌شود،
فراخوانی‌های برگشتی راه‌اندازی می‌شود
    شکل ۵. وضعیت برنامه پس‌از قطع اتصال از شبکه Wi-Fi.

اگر تنظیم داده تلفن همراه همیشه روشن خاموش باشد، وقتی Wi-Fi قطع می‌شود، دستگاه سعی می‌کند دوباره به شبکه تلفن همراه متصل شود. تصویر مشابه است، اما با تأخیر کوتاه اضافی برای تماس‌های onAvailable()، و تماس برگشتی شبکه معمولی نیز تماس‌های onAvailable()، onNetworkCapabilitiesChanged()، و onLinkPropertiesChanged() را دریافت می‌کند زیرا تلفن همراه دردسترس قرار می‌گیرد.

محدودیت‌های استفاده از شبکه برای انتقال داده

اینکه بتوانید شبکه‌ای را با بازگشت تماس شبکه ببینید به این معنی نیست که برنامه‌تان می‌تواند از شبکه برای انتقال داده استفاده کند. برخی‌از شبکه‌ها اتصال اینترنت ارائه نمی‌دهند و برخی‌از شبکه‌ها ممکن است به برنامه‌های دارای امتیاز محدود باشند. برای بررسی اتصال اینترنت، NET_CAPABILITY_INTERNET و NET_CAPABILITY_VALIDATED را ببینید.

استفاده از شبکه‌های پس‌زمینه نیز مشمول بررسی‌های اجازه است. اگر برنامه‌تان می‌خواهد از شبکه پس‌زمینه استفاده کند، به اجازه CHANGE_NETWORK_STATE نیاز دارد.

برنامه‌های دارای این اجازه به سیستم امکان می‌دهند تلاش کند شبکه‌ای را که فعال نیست، مثلاً شبکه تلفن همراه وقتی دستگاه به شبکه Wi-Fi متصل است، فعال کند. چنین برنامه‌ای ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) را با NetworkCallback فراخوانی می‌کند تا هنگام راه‌اندازی شبکه فراخوانی شود.