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

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

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

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

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

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

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

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

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

قابلیت‌های شبکه و ویژگی‌های پیوند

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

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

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

انتقال، انتزاعی از یک رسانه فیزیکی است که یک شبکه روی آن کار می‌کند. نمونه‌های رایج انتقال، اترنت، وای‌فای و موبایل هستند. VPNها و وای‌فای نظیر به نظیر نیز می‌توانند انتقال باشند. در اندروید، یک شبکه می‌تواند همزمان چندین انتقال داشته باشد. نمونه‌ای از این، VPN است که هم روی شبکه‌های وای‌فای و هم روی شبکه‌های موبایل کار می‌کند. VPN شامل انتقال‌های وای‌فای، موبایل و VPN است. برای فهمیدن اینکه آیا یک شبکه انتقال خاصی دارد یا خیر، از متد NetworkCapabilities.hasTransport(int) به همراه یکی از ثابت‌های NetworkCapabilities.TRANSPORT_* استفاده کنید.

یک قابلیت، یک ویژگی از شبکه را توصیف می‌کند. از جمله این قابلیت‌ها می‌توان به MMS ، NOT_METERED و INTERNET اشاره کرد. شبکه‌ای با قابلیت MMS می‌تواند پیام‌های سرویس پیام‌رسانی چندرسانه‌ای را ارسال و دریافت کند و شبکه‌ای بدون این قابلیت نمی‌تواند. شبکه‌ای با قابلیت NOT_METERED برای داده از کاربر هزینه دریافت نمی‌کند. برنامه شما می‌تواند با استفاده از متد NetworkCapabilities.hasCapability(int) به همراه یکی از ثابت‌های NetworkCapabilities.NET_CAPABILITY_* ، قابلیت‌های مناسب را بررسی کند.

پرکاربردترین ثابت‌های NET_CAPABILITY_* عبارتند از:

  • NET_CAPABILITY_INTERNET : نشان می‌دهد که شبکه برای دسترسی به اینترنت تنظیم شده است. این مربوط به تنظیمات است و نه توانایی واقعی برای دسترسی به سرورهای عمومی. به عنوان مثال، یک شبکه می‌تواند برای دسترسی به اینترنت تنظیم شود اما تابع یک پورتال محدود باشد.

    شبکه تلفن همراه یک اپراتور معمولاً قابلیت اتصال INTERNET را دارد، در حالی که یک شبکه وای‌فای محلی P2P معمولاً این قابلیت را ندارد. برای اتصال واقعی، به 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) استفاده کنید. این دو متد اهداف متفاوتی را دنبال می‌کنند.

همه برنامه‌های اندروید یک شبکه پیش‌فرض دارند که توسط سیستم تعیین می‌شود. سیستم معمولاً شبکه‌های بدون محدودیت سرعت را به شبکه‌های دارای محدودیت سرعت و شبکه‌های سریع‌تر را به شبکه‌های کندتر ترجیح می‌دهد.

وقتی یک برنامه درخواست شبکه‌ای می‌دهد، مثلاً با HttpsURLConnection ، سیستم این درخواست را با استفاده از شبکه پیش‌فرض برآورده می‌کند. برنامه‌ها می‌توانند ترافیک را روی شبکه‌های دیگر نیز ارسال کنند. برای اطلاعات بیشتر، به بخش «شبکه‌های اضافی» مراجعه کنید.

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

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

کاتلین

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) یا هر دو را پیاده‌سازی کنید.

برای یک callback ثبت شده با registerDefaultNetworkCallback() ، onLost() به این معنی است که شبکه، وضعیت شبکه پیش‌فرض بودن خود را از دست داده است. ممکن است اتصال آن قطع شده باشد.

اگرچه می‌توانید با پرس‌وجوی NetworkCapabilities.hasTransport(int) در مورد انتقال‌هایی که شبکه پیش‌فرض استفاده می‌کند اطلاعات کسب کنید، اما این یک پروکسی ضعیف برای پهنای باند یا میزان پهنای باند شبکه است. برنامه شما نمی‌تواند فرض کند که Wi-Fi همیشه بدون محدودیت است و همیشه پهنای باند بهتری نسبت به موبایل ارائه می‌دهد.

در عوض از NetworkCapabilities.getLinkDownstreamBandwidthKbps() برای اندازه‌گیری پهنای باند و NetworkCapabilites.hasCapability(int) با آرگومان‌های NET_CAPABILITY_NOT_METERED برای تعیین میزان اندازه‌گیری استفاده کنید. برای اطلاعات بیشتر، به بخش مربوط به NetworkCapabilities و LinkProperties مراجعه کنید.

به طور پیش‌فرض، متدهای callback در thread اتصال برنامه شما فراخوانی می‌شوند، که یک thread جداگانه است که توسط ConnectivityManager استفاده می‌شود. اگر پیاده‌سازی callbackهای شما نیاز به انجام کار طولانی‌تری دارد، آن‌ها را با استفاده از نوع ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) در یک worker thread جداگانه فراخوانی کنید.

وقتی دیگر از callback خود استفاده نمی‌کنید، با فراخوانی ConnectivityManager.unregisterNetworkCallback(NetworkCallback) آن را از حالت ثبت خارج کنید. activity اصلی شما در onPause() جای خوبی برای انجام این کار است، به خصوص اگر callback را در 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 را می‌پذیرد، بنابراین thread Connectivity برنامه شما را بارگذاری نمی‌کند.

وقتی فراخوانی برگشتی دیگر مرتبط نیست، ConnectivityManager.unregisterNetworkCallback(NetworkCallback) را فراخوانی کنید. یک برنامه می‌تواند همزمان چندین فراخوانی برگشتی شبکه را ثبت کند.

برای راحتی، شیء NetworkRequest شامل قابلیت‌های رایجی است که اکثر برنامه‌ها به آن نیاز دارند، از جمله موارد زیر:

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

برای مثال، اگر برنامه شما نیاز به ارسال پیام‌های MMS دارد، NET_CAPABILITY_MMS به NetworkRequest اضافه کنید تا از دریافت اطلاعات در مورد تمام شبکه‌هایی که نمی‌توانند پیام‌های MMS ارسال کنند، جلوگیری شود. اگر برنامه شما فقط به اتصال Wi-Fi P2P علاقه‌مند است، TRANSPORT_WIFI_AWARE اضافه کنید. NET_CAPABILITY_INTERNET و NET_CAPABILITY_VALIDATED اگر به قابلیت انتقال داده با یک سرور در اینترنت علاقه‌مند هستید، مفید هستند.

نمونه توالی فراخوانی مجدد

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

جدول زمانی به شرح زیر است:

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

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

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

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

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

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

  4. در این مرحله، ممکن است اعتبارسنجی شبکه Wi-Fi مدتی طول بکشد. در این حالت، فراخوانی‌های onNetworkCapabilitiesChanged() برای فراخوانی شبکه معمولی، قابلیت NET_CAPABILITY_VALIDATED را شامل نمی‌شوند. پس از مدت کوتاهی، فراخوانی به onNetworkCapabilitiesChanged() دریافت می‌کند که در آن قابلیت‌های جدید شامل NET_CAPABILITY_VALIDATED می‌شوند. در بیشتر موارد، اعتبارسنجی بسیار سریع انجام می‌شود.

    وقتی شبکه وای‌فای اعتبارسنجی می‌شود، سیستم آن را به شبکه موبایل ترجیح می‌دهد، عمدتاً به این دلیل که بدون محدودیت مصرف است. شبکه وای‌فای به شبکه پیش‌فرض تبدیل می‌شود، بنابراین تابع فراخوانی شبکه پیش‌فرض، فراخوانی onAvailable() ، onNetworkCapabilitiesChanged() و onLinkPropertiesChanged() برای شبکه وای‌فای دریافت می‌کند. شبکه موبایل به پس‌زمینه می‌رود و تابع فراخوانی شبکه معمولی، فراخوانی onLosing() را برای شبکه موبایل دریافت می‌کند.

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

    نمودار وضعیت که فراخوانی‌های برگشتی را هنگام اعتبارسنجی اتصال شبکه Wi-Fi نشان می‌دهد
    شکل ۴. وضعیت برنامه پس از تأیید اعتبار شبکه Wi-Fi.

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

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

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

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

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

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

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