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

على مدار عمر الهاتف الذكي، يمكن أن تتجاوز تكلفة خطة بيانات شبكة الجوّال تكلفة الجهاز نفسه بسهولة. في نظام التشغيل 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.
    }
}

Java

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
يتم عرض قائمة كاملة بأوامر Network Policy Manager (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 المحدد على أنها تفرض تكلفة استخدام، ما يسمح لك بمحاكاة شبكة تفرض تكلفة استخدام على شبكة لا تفرض تكلفة استخدام.