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

يوفّر 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);