وضعیت اتصال و اندازه گیری اتصال را نظارت کنید

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

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

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

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

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

کاتلین

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

جاوا

NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .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);