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

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)

جاوا

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

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

کاتلین

val currentNetwork = connectivityManager.getActiveNetwork()

جاوا

Network currentNetwork = connectivityManager.getActiveNetwork();

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

کاتلین

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

جاوا

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork);
LinkProperties 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: نشان می‌دهد که شبکه، شبکه خصوصی مجازی نیست.

  • 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 جدید تغییر می‌دهد.

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

کاتلین

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)
    }
})

جاوا

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 از آن استفاده می‌کند. اگر پیاده‌سازی شما از 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)

جاوا

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