مراقبة حالة الاتصال وقياس عدد الاتصالات

توفّر ConnectivityManager واجهة برمجة تطبيقات تتيح لك طلب اتصال الجهاز بإحدى الشبكات استنادًا إلى عدة حالات تتضمن إمكانات الجهاز وخيارات نقل البيانات.

تُوفّر عملية معاودة الاتصال معلومات لتطبيقك حول حالة اتصال الجهاز بالإضافة إلى إمكانات الشبكة المتصلة حاليًا. تتيح لك واجهة برمجة التطبيقات تحديد ما إذا كان الجهاز متصلاً حاليًا بشبكة تستوفي متطلبات تطبيقك.

إعداد طلب شبكة

لتحديد نوع نقل الشبكة، مثل Wi-Fi أو اتصال شبكة الجوّال، وإمكانيات الشبكة المتصلة حاليًا، مثل اتصال الإنترنت، يجب ضبط طلب شبكة.

يمكنك تعريف NetworkRequest الذي يصف متطلبات الاتصال بالشبكة في تطبيقك. ينشئ الرمز التالي طلبًا لشبكة متصلة بالإنترنت وتستخدم إما اتصال Wi-Fi أو اتصال شبكة الجوّال لنوع النقل.

Kotlin

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

Java

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 معلومات حول الإمكانات الحالية للشبكة.

Kotlin

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)
    }
}

Java

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" عن الحالة.

Kotlin

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

Java

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