پایش وضعیت اتصال‌پذیری و اندازه‌گیری اتصال

ConnectivityManager میانای برنامه‌سازی کاربردی‌ای ارائه می‌دهد که به شما امکان می‌دهد درخواست کنید دستگاه براساس شرایط مختلفی ازجمله قابلیت‌های دستگاه و گزینه‌های انتقال داده به شبکه متصل شود.

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

پیکربندی درخواست شبکه

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

NetworkRequest را اعلام کنید که نیازهای اتصال شبکه برنامه‌تان را شرح می‌دهد. کد زیر درخواستی برای شبکه‌ای ایجاد می‌کند که به اینترنت متصل است و از اتصال Wi-Fi، اترنت، یا تلفن همراه برای نوع انتقال استفاده می‌کند.

private val networkRequest = NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
    .build()

توجه داشته باشید که برخی‌از اتصال‌ها ممکن است به‌طور قابل‌توجهی گران‌تر از اتصال‌های دیگر باشند (برای مثال، اتصال تلفن همراه معمولاً گران است). از NetworkCapabilities#NET_CAPABILITY_NOT_METERED برای تعیین اینکه آیا اتصال گران است یا نه استفاده کنید. وقتی اتصال با حجم محدود است، سعی کنید مصرف داده برنامه‌تان را کاهش دهید یا آن را تا زمانی که دستگاه اتصال با حجم نامحدود دارد به‌تأخیر بیندازید.

پیکربندی تماس برگشتی شبکه

وقتی NetworkRequest را با ConnectivityManager ثبت می‌کنید، باید NetworkCallback را پیاده‌سازی کنید تا اعلان‌های مربوط به تغییرات در وضعیت اتصال و قابلیت‌های شبکه را دریافت کنید.

رایج‌ترین توابع پیاده‌سازی‌شده در NetworkCallback شامل موارد زیر است:

  • onAvailable() نشان می‌دهد که دستگاه به شبکه جدیدی متصل است که الزامات نوع انتقال و قابلیت‌های مشخص‌شده در NetworkRequest را برآورده می‌کند.
  • onLost() نشان می‌دهد که اتصال دستگاه به شبکه قطع شده است.
  • onCapabilitiesChanged() نشان می‌دهد که قابلیت‌های شبکه تغییر کرده است. شیء NetworkCapabilities اطلاعاتی درباره قابلیت‌های فعلی شبکه ارائه می‌دهد.

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        // Network is available for use.
    }

    // Network capabilities have changed for the network.
    override fun onCapabilitiesChanged(
        network: Network,
        networkCapabilities: NetworkCapabilities
    ) {
        val unmetered =
            networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
        if (!unmetered) {
            // Reduce data usage, or delay it until the network is unmetered.
        }
    }

    override fun onLost(network: Network) {
        // Lost network connection.
    }
}

ثبت‌نام برای به‌روزرسانی‌های شبکه

پس‌از اعلام NetworkRequest و NetworkCallback، از تابع‌های requestNetwork() یا registerNetworkCallback() برای جستجوی شبکه‌ای برای اتصال از دستگاهی که با NetworkRequest مطابقت دارد استفاده کنید. سپس وضعیت به NetworkCallback گزارش می‌شود.

val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)