تحسين استخدام بيانات الشبكة
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
على مدار عمر الهاتف الذكي، يمكن أن تكون تكلفة خطة بيانات شبكة الجوّال
أن يتجاوزوا تكلفة الجهاز نفسه على نظام التشغيل 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()
لتحديد مقدار البيانات
يجب أن يستخدم التطبيق:
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
-
يؤدي هذا الخيار إلى عرض قائمة كاملة بأوامر مدير سياسات الشبكة (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 المحدّد على أنّه قابل للقياس، ما يسمح لك بمحاكاة
شبكة تفرض تكلفة استخدام على شبكة لا تفرض تكلفة استخدام.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Optimize network data usage\n\nOver the life of a smartphone, the cost of a cellular data plan can easily\nexceed the cost of the device itself. On Android 7.0 (API level 24) and\nhigher, users can enable Data Saver on a device-wide basis in order to\noptimize their device's data usage, and use less data. This ability\nis especially useful when roaming, near the end of the billing cycle,\nor for a small prepaid data pack.\n\n\nWhen a user enables Data Saver in **Settings** and the device is\non a metered network, the system blocks background data usage and signals\napps to use less data in the foreground wherever possible. Users can\nallow specific apps to use background metered data usage even when Data\nSaver is turned on.\n\n\nAndroid 7.0 (API level 24) extends the\n[ConnectivityManager](/reference/android/net/ConnectivityManager)\nAPI to provide apps with a way to [retrieve the user's Data\nSaver preferences](#status) and [monitor preference\nchanges](#monitor-changes). It is considered good practice for apps to check whether the\nuser has enabled Data Saver and make an effort to limit foreground and\nbackground data usage.\n\nCheck data saver preferences\n----------------------------\n\n\nOn Android 7.0 (API level 24) and higher, apps can use the\n[ConnectivityManager](/reference/android/net/ConnectivityManager) API\nto determine what data usage restrictions are being applied. The\n[getRestrictBackgroundStatus()](/reference/android/net/ConnectivityManager#getRestrictBackgroundStatus())\nmethod returns one of the following values:\n\n\n`RESTRICT_BACKGROUND_STATUS_DISABLED`\n:\n Data Saver is disabled.\n\n\n`RESTRICT_BACKGROUND_STATUS_ENABLED`\n:\n The user has enabled Data Saver for this app. Apps should make an effort to limit data\n usage in the foreground and gracefully handle restrictions to background\n data usage.\n\n\n`RESTRICT_BACKGROUND_STATUS_WHITELISTED`\n:\n The user has enabled Data Saver but the app is allowed to bypass it.\n Apps should still make an effort to limit foreground and background data usage.\n\n\nLimit data usage whenever the device is connected to a metered network, even if Data Saver is\ndisabled or the app is allowed to bypass it. The following sample code uses\n[ConnectivityManager.isActiveNetworkMetered()](/reference/android/net/ConnectivityManager#isActiveNetworkMetered())\nand `ConnectivityManager.getRestrictBackgroundStatus()` to determine how much data the\napp should use: \n\n### Kotlin\n\n```kotlin\n(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {\n // Checks if the device is on a metered network\n if (isActiveNetworkMetered) {\n // Checks user's Data Saver settings.\n when (restrictBackgroundStatus) {\n RESTRICT_BACKGROUND_STATUS_ENABLED -\u003e {\n // Background data usage is blocked for this app. Wherever possible,\n // the app should also use less data in the foreground.\n }\n RESTRICT_BACKGROUND_STATUS_WHITELISTED -\u003e {\n // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,\n // the app should use less data in the foreground and background.\n }\n RESTRICT_BACKGROUND_STATUS_DISABLED -\u003e {\n // Data Saver is disabled. Since the device is connected to a\n // metered network, the app should use less data wherever possible.\n }\n }\n } else {\n // The device is not on a metered network.\n // Use data as required to perform syncs, downloads, and updates.\n }\n}\n```\n\n### Java\n\n```java\nConnectivityManager connMgr = (ConnectivityManager)\n getSystemService(Context.CONNECTIVITY_SERVICE);\n// Checks if the device is on a metered network\nif (connMgr.isActiveNetworkMetered()) {\n // Checks user's Data Saver settings.\n switch (connMgr.getRestrictBackgroundStatus()) {\n case RESTRICT_BACKGROUND_STATUS_ENABLED:\n // Background data usage is blocked for this app. Wherever possible,\n // the app should also use less data in the foreground.\n\n case RESTRICT_BACKGROUND_STATUS_WHITELISTED:\n // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,\n // the app should use less data in the foreground and background.\n\n case RESTRICT_BACKGROUND_STATUS_DISABLED:\n // Data Saver is disabled. Since the device is connected to a\n // metered network, the app should use less data wherever possible.\n }\n} else {\n // The device is not on a metered network.\n // Use data as required to perform syncs, downloads, and updates.\n}\n```\n\n\n**Note:** This behavior is different on Android TV. Instead of\nblocking background usage, Android TV only throttles it. When in the\nforeground, applications are limited to 800 Kbps, and when in the background,\napplications are limited to 10 Kbps. Use\n`ConnectivityManager.isActiveNetworkMetered()` to detect when to\nlimit data usage on TV.\n\n### Request data restriction permissions\n\n\nIf your app needs to use data in the background, it can request data\nrestriction permissions by sending a\n`Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS`\nintent containing a URI of your app's package name: for example,\n`package:MY_APP_ID`.\n\n\nSending the intent and URI launches the **Settings** app and\ndisplays data usage settings for your app. The user can then decide whether\nto enable background data for your app. Before you send this intent, it is\ngood practice to first ask the user if they want to launch the\n**Settings** app for the purpose of enabling background data\nusage.\n\nMonitor changes to data saver preferences\n-----------------------------------------\n\n\nApps can monitor changes to Data Saver preferences by creating a\n[BroadcastReceiver](/reference/android/content/BroadcastReceiver) to\nlisten for `ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED` and dynamically\nregistering the receiver with\n[Context.registerReceiver()](/reference/android/content/Context#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)).\nWhen an app receives this broadcast, it should [check if the new Data Saver\npreferences affect its permissions](#status) by calling\n`ConnectivityManager.getRestrictBackgroundStatus()`.\n\n\n**Note:** The system only sends this broadcast to apps that dynamically register for\nthem with\n[Context.registerReceiver()](/reference/android/content/Context#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter)).\nApps that register to receive this broadcast in their manifest will not receive them.\n\nTest with Android Debug Bridge commands\n---------------------------------------\n\n\nThe [Android Debug Bridge (ADB)](/tools/help/adb)\nprovides a few commands that you can use to test your app in Data Saver\nconditions. You can check and configure network\npermissions or set wireless networks as metered to test your app on unmetered\nnetworks.\n\n\n`$ adb shell dumpsys netpolicy`\n:\n Generates a report that includes the current global background network\n restriction setting, package UIDs that are currently allowed to bypass Data Saver, and the\n network permissions of other known packages.\n\n\n`$ adb shell cmd netpolicy`\n:\n Displays a full list of Network Policy Manager (netpolicy) commands.\n\n\n`$ adb shell cmd netpolicy set restrict-background\n\u003cboolean\u003e`\n:\n Enables or disables Data Saver mode when passing `true` or\n `false`, respectively.\n\n\n`$ adb shell cmd netpolicy add restrict-background-whitelist\n\u003cUID\u003e`\n:\n Adds the specified package UID to the allowlist (`whitelist`) to allow background\n metered data usage.\n\n\n`$ adb shell cmd netpolicy remove restrict-background-whitelist\n\u003cUID\u003e`\n:\n Removes the specified package UID from the allowlist (`whitelist`) to block\n background metered data usage while Data Saver is enabled.\n\n\n`$ adb shell cmd netpolicy list wifi-networks`\n:\n Lists all wifi networks, displaying whether they're metered.\n\n\n`$ adb shell cmd netpolicy set metered-network \u003cWIFI_SSID\u003e\ntrue`\n:\n Sets wifi with the specified SSID as metered, allowing you to simulate a\n metered network on an unmetered network."]]