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

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

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

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

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

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

استفاده از 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 ثبت کنید. برای اطلاعات بیشتر در مورد ثبت تماس های شبکه، به گوش دادن به رویدادهای شبکه مراجعه کنید.

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

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

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

شی NetworkCapabilities اطلاعات مربوط به انتقال شبکه و قابلیت های آنها را در بر می گیرد.

حمل و نقل انتزاعی از یک رسانه فیزیکی است که یک شبکه بر روی آن عمل می کند. نمونه های متداول حمل و نقل عبارتند از اترنت، وای فای و موبایل. VPN ها و Wi-Fi نظیر به نظیر نیز می توانند حمل و نقل باشند. در اندروید، یک شبکه می‌تواند چندین حمل و نقل را به طور همزمان داشته باشد. یک مثال از این یک VPN است که هم از طریق Wi-Fi و هم از طریق شبکه تلفن همراه کار می کند. VPN دارای انتقال Wi-Fi، موبایل و 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 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) استفاده کنید. این دو روش اهداف متفاوتی را دنبال می کنند.

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

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

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

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

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

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

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

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

  1. هنگامی که برنامه با registerNetworkCallback() تماس می گیرد، callback بلافاصله تماس هایی را از 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 قطع می شود، زیرا از محدوده خارج شده است. از آنجایی که وای فای قطع می شود، تماس معمولی شبکه یک تماس با 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 که هنگام بالا آمدن شبکه فراخوانی می‌شود، فراخوانی می‌کند.