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

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

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

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

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

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

کاتلین

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

جاوا

NetworkRequest networkRequest = new 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() {
    // network is available for use
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
    }

    // Network capabilities have changed for the network
    override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
    ) {
        super.onCapabilitiesChanged(network, networkCapabilities)
        val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
    }

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

جاوا

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
    }

    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
    }
};

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

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

کاتلین

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

جاوا

ConnectivityManager connectivityManager =
        (ConnectivityManager) getSystemService(ConnectivityManager.class);
connectivityManager.requestNetwork(networkRequest, networkCallback);