تحسين استخدام بيانات الشبكة

على مدار عمر الهاتف، يمكن أن تتجاوز تكلفة خطة بيانات الجوّال تكلفة الجهاز نفسه. على نظام التشغيل Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن للمستخدمين تفعيل ميزة "توفير البيانات" على مستوى الجهاز لتحسين استخدام البيانات على أجهزتهم واستخدام بيانات أقل. وهذه الإمكانية مفيدة بشكل خاص عند التجوال أو قرب نهاية دورة الفوترة أو عند استخدام حزمة بيانات صغيرة مدفوعة مسبقًا.

عندما يفعّل المستخدم ميزة "توفير البيانات" في الإعدادات ويكون الجهاز متصلاً بشبكة محدودة، يحظر النظام استخدام البيانات في الخلفية ويطلب من التطبيقات استخدام بيانات أقل في المقدّمة كلما أمكن ذلك. يمكن للمستخدمين السماح لتطبيقات معيّنة باستخدام البيانات في الخلفية حتى عندما تكون ميزة "توفير البيانات" مفعَّلة.

يوفّر Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) واجهة برمجة التطبيقات ConnectivityManager لتزويد التطبيقات بطريقة لاسترداد الإعدادات المفضّلة للمستخدم في ميزة "توفير البيانات" ومراقبة تغييرات الإعدادات المفضّلة. من الممارسات الجيدة أن تتحقّق التطبيقات مما إذا كان المستخدم قد فعّل ميزة "توفير البيانات"، وأن تبذل جهدًا للحدّ من استخدام البيانات في المقدّمة والخلفية.

التحقّق من الإعدادات المفضّلة لميزة "توفير البيانات"

في نظام التشغيل Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن للتطبيقات استخدام واجهة برمجة التطبيقات ConnectivityManager لتحديد قيود استخدام البيانات التي يتم تطبيقها. تعرض الطريقة getRestrictBackgroundStatus() إحدى القيم التالية:

RESTRICT_BACKGROUND_STATUS_DISABLED
ميزة "توفير البيانات" غير مفعَّلة.
RESTRICT_BACKGROUND_STATUS_ENABLED
فعّل المستخدم ميزة "توفير البيانات" لهذا التطبيق. يجب أن تبذل التطبيقات جهدًا للحد من استخدام البيانات في المقدّمة والتعامل بسلاسة مع القيود المفروضة على استخدام البيانات في الخلفية.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
فعَّل المستخدم ميزة "توفير البيانات"، ولكن يُسمح للتطبيق بتجاوزها. يجب أن تبذل التطبيقات جهدًا للحدّ من استخدام البيانات في المقدّمة والخلفية.

يتم الحدّ من استخدام البيانات عندما يكون الجهاز متصلاً بشبكة محدودة، حتى إذا كانت ميزة "توفير البيانات" غير مفعَّلة أو إذا كان التطبيق مسموحًا له بتجاوزها. يستخدم الرمز النموذجي التالي ConnectivityManager.isActiveNetworkMetered() وConnectivityManager.getRestrictBackgroundStatus() لتحديد مقدار البيانات التي يجب أن يستخدمها التطبيق:

with(getSystemService(ConnectivityManager::class.java)) {
    // Checks if the device is on a metered network.
    if (isActiveNetworkMetered) {
        // Checks user’s Data Saver settings.
        when (restrictBackgroundStatus) {
            RESTRICT_BACKGROUND_STATUS_ENABLED -> {
                // Background data usage is blocked for this app. Wherever possible,
                // the app should also use less data in the foreground.
            }
            RESTRICT_BACKGROUND_STATUS_WHITELISTED -> {
                // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
                // the app should use less data in the foreground and background.
            }
            RESTRICT_BACKGROUND_STATUS_DISABLED -> {
                // Data Saver is disabled. Since the device is connected to a
                // metered network, the app should use less data wherever possible.
            }
        }
    } else {
        // The device is not on a metered network.
        // Use data as required to perform syncs, downloads, and updates.
    }
}

ملاحظة: يختلف هذا السلوك على Android TV. وبدلاً من حظر الاستخدام في الخلفية، يقلّل Android TV من معدّل الاستخدام فقط. عندما تكون التطبيقات في المقدّمة، يقتصر معدّل نقل البيانات على 800 كيلوبت في الثانية، وعندما تكون في الخلفية، يقتصر معدّل نقل البيانات على 10 كيلوبت في الثانية. استخدِم ConnectivityManager.isActiveNetworkMetered() لرصد الحالات التي يجب فيها الحدّ من استخدام البيانات على التلفزيون.

طلب أذونات مقيّدة للبيانات

إذا كان تطبيقك يحتاج إلى استخدام البيانات في الخلفية، يمكنه طلب أذونات تقييد البيانات عن طريق إرسال نية Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS تحتوي على معرّف موارد منتظم (URI) لاسم حزمة تطبيقك، على سبيل المثال، package:MY_APP_ID.

يؤدي إرسال الغرض ومعرّف الموارد المنتظم (URI) إلى تشغيل تطبيق الإعدادات وعرض إعدادات استخدام البيانات لتطبيقك. ويمكن للمستخدم بعد ذلك تحديد ما إذا كان يريد تفعيل بيانات الخلفية لتطبيقك. قبل إرسال هذا الغرض، من الأفضل أن تسأل المستخدم أولاً عما إذا كان يريد تشغيل تطبيق الإعدادات لغرض تفعيل استخدام بيانات الخلفية.

مراقبة التغييرات في الإعدادات المفضّلة لميزة "توفير البيانات"

يمكن للتطبيقات مراقبة التغييرات في إعدادات "توفير البيانات" المفضّلة من خلال إنشاء BroadcastReceiver للاستماع إلى ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED وتسجيل المستلِم ديناميكيًا باستخدام Context.registerReceiver(). عندما يتلقّى أحد التطبيقات هذا البث، عليه التحقّق مما إذا كانت الإعدادات المفضّلة الجديدة لميزة "توفير البيانات" تؤثر في أذوناته من خلال استدعاء ConnectivityManager.getRestrictBackgroundStatus().

ملاحظة: لا يرسل النظام هذا البث إلا إلى التطبيقات التي تسجّل فيه ديناميكيًا باستخدام Context.registerReceiver(). ولن تتلقّى التطبيقات التي تسجّل لتلقّي هذا البث في ملف البيان الخاص بها.

الاختبار باستخدام أوامر Android Debug Bridge

توفّر أداة Android Debug Bridge (ADB) بعض الأوامر التي يمكنك استخدامها لاختبار تطبيقك في ظروف "توفير البيانات". يمكنك التحقّق من أذونات الشبكة وضبطها أو ضبط الشبكات اللاسلكية على أنّها تفرض تكلفة استخدام لاختبار تطبيقك على الشبكات التي لا تفرض تكلفة استخدام.

$ adb shell dumpsys netpolicy
يتم إنشاء تقرير يتضمّن الإعدادات العامة الحالية لقيود الشبكة في الخلفية، وأرقام تعريف المستخدمين للحِزم المسموح لها حاليًا بتجاوز ميزة "توفير البيانات"، وأذونات الشبكة للحِزم الأخرى المعروفة.
$ adb shell cmd netpolicy
يعرض هذا الأمر قائمة كاملة بأوامر "إدارة سياسات الشبكة" (netpolicy).
$ adb shell cmd netpolicy set restrict-background <boolean>
يتم تفعيل وضع "توفير البيانات" أو إيقافه عند تمرير true أو false على التوالي.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
تتم إضافة معرّف UID الخاص بالحزمة المحدّدة إلى القائمة المسموح بها (whitelist) للسماح باستخدام البيانات المحدودة في الخلفية.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
يؤدي هذا الإجراء إلى إزالة معرّف UID الخاص بالحزمة المحدّدة من القائمة المسموح بها (whitelist) لحظر استخدام البيانات في الخلفية عندما تكون ميزة "توفير البيانات" مفعَّلة.
$ adb shell cmd netpolicy list wifi-networks
تعرض هذه السياسة قائمة بجميع شبكات Wi-Fi، وتوضّح ما إذا كانت محدودة أم لا.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
يضبط هذا الإعداد شبكة Wi-Fi التي تتضمّن معرّف SSID المحدّد على أنّها شبكة تفرض تكلفة استخدام، ما يتيح لك محاكاة شبكة تفرض تكلفة استخدام على شبكة لا تفرض تكلفة استخدام.