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

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

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

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

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

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

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

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

لغة Kotlin

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
    // 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.
    }
}

جافا

ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
  // Checks user’s Data Saver settings.
  switch (connMgr.getRestrictBackgroundStatus()) {
    case RESTRICT_BACKGROUND_STATUS_ENABLED:
    // Background data usage is blocked for this app. Wherever possible,
    // the app should also use less data in the foreground.

    case 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.

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