بهینه سازی استفاده از داده های شبکه
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
در طول عمر یک تلفن هوشمند، هزینه برنامه داده سلولی می تواند به راحتی از هزینه خود دستگاه بیشتر شود. در Android 7.0 (سطح API 24) و بالاتر، کاربران میتوانند Data Saver را در سراسر دستگاه فعال کنند تا مصرف داده دستگاه خود را بهینه کنند و از داده کمتری استفاده کنند. این توانایی به ویژه در هنگام رومینگ، نزدیک به پایان چرخه صورتحساب، یا برای یک بسته داده پیشپرداخت کوچک مفید است.
وقتی کاربر بهینهسازی داده را در تنظیمات فعال میکند و دستگاه در یک شبکه اندازهگیری شده است، سیستم استفاده از دادههای پسزمینه را مسدود میکند و به برنامهها سیگنال میدهد تا در صورت امکان از داده کمتری در پیشزمینه استفاده کنند. کاربران میتوانند به برنامههای خاص اجازه دهند از مصرف داده اندازهگیری شده در پسزمینه استفاده کنند، حتی وقتی «بهینهسازی داده» روشن است.
Android 7.0 (سطح API 24) رابط برنامهنویسی ConnectivityManager
را گسترش میدهد تا به برنامهها راهی برای بازیابی تنظیمات برگزیده ذخیرهسازی داده کاربر و نظارت بر تغییرات ترجیحی ارائه دهد. برای برنامهها این که بررسی کنند آیا کاربر Data Saver را فعال کرده است یا خیر و تلاشی برای محدود کردن استفاده از دادههای پیشزمینه و پسزمینه انجام دهند، عمل خوبی در نظر گرفته میشود.
تنظیمات برگزیده صرفه جویی داده را بررسی کنید
در Android 7.0 (سطح API 24) و بالاتر، برنامهها میتوانند از ConnectivityManager
API برای تعیین محدودیتهای استفاده از داده استفاده کنند. متد getRestrictBackgroundStatus()
یکی از مقادیر زیر را برمی گرداند:
-
RESTRICT_BACKGROUND_STATUS_DISABLED
- ذخیره داده غیرفعال است.
-
RESTRICT_BACKGROUND_STATUS_ENABLED
- کاربر Data Saver را برای این برنامه فعال کرده است. برنامهها باید تلاش کنند تا استفاده از داده را در پیشزمینه محدود کنند و محدودیتهای استفاده از داده پسزمینه را بهخوبی مدیریت کنند.
-
RESTRICT_BACKGROUND_STATUS_WHITELISTED
- کاربر Data Saver را فعال کرده است اما برنامه مجاز است آن را دور بزند. برنامه ها همچنان باید تلاش کنند تا استفاده از داده های پیش زمینه و پس زمینه را محدود کنند.
هر زمان که دستگاه به یک شبکه اندازهگیری متصل است، مصرف داده را محدود کنید، حتی اگر Data Saver غیرفعال باشد یا برنامه مجاز باشد آن را دور بزند. کد نمونه زیر از ConnectivityManager.isActiveNetworkMetered()
و ConnectivityManager.getRestrictBackgroundStatus()
برای تعیین میزان داده ای که برنامه باید استفاده کند استفاده می کند:
کاتلین
(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
درخواست کند.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS حاوی یک URI از نام بسته برنامه شما: به عنوان مثال، package:MY_APP_ID
.
ارسال intent و URI برنامه Settings را راهاندازی میکند و تنظیمات مصرف داده را برای برنامه شما نمایش میدهد. سپس کاربر می تواند تصمیم بگیرد که آیا داده های پس زمینه را برای برنامه شما فعال کند یا خیر. قبل از ارسال این هدف، تمرین خوبی است که ابتدا از کاربر بپرسید که آیا میخواهد برنامه تنظیمات را به منظور فعال کردن استفاده از دادههای پسزمینه راهاندازی کند.
تغییرات در تنظیمات برگزیده صرفه جویی داده را نظارت کنید
برنامهها میتوانند با ایجاد یک BroadcastReceiver
برای گوش دادن به ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
و ثبت پویا گیرنده با Context.registerReceiver()
تغییرات در تنظیمات برگزیده بهینهسازی داده را نظارت کنند. هنگامی که یک برنامه این پخش را دریافت می کند، باید با فراخوانی ConnectivityManager.getRestrictBackgroundStatus()
بررسی کند که آیا تنظیمات برگزیده جدید Data Saver بر مجوزهای آن تأثیر می گذارد.
توجه: سیستم این پخش را فقط برای برنامه هایی ارسال می کند که به صورت پویا با Context.registerReceiver()
ثبت نام می کنند. برنامه هایی که برای دریافت این پخش در مانیفست خود ثبت نام می کنند، آنها را دریافت نخواهند کرد.
با دستورات Android Debug Bridge تست کنید
پل اشکال زدایی اندروید (ADB) چند دستور را ارائه می دهد که می توانید از آنها برای آزمایش برنامه خود در شرایط ذخیره داده استفاده کنید. میتوانید مجوزهای شبکه را بررسی و پیکربندی کنید یا شبکههای بیسیم را بهعنوان اندازهگیری شده تنظیم کنید تا برنامه خود را روی شبکههای بدون اندازهگیری آزمایش کنید.
-
$ adb shell dumpsys netpolicy
- گزارشی ایجاد میکند که شامل تنظیمات محدودیت شبکه پسزمینه جهانی، UIDهای بستهای که در حال حاضر مجاز به دور زدن Data Saver هستند و مجوزهای شبکه سایر بستههای شناخته شده است.
-
$ 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>
- UID بسته مشخص شده را به لیست مجاز (
whitelist
) اضافه می کند تا امکان استفاده از داده های اندازه گیری شده در پس زمینه را فراهم کند. -
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
- UID بسته مشخص شده را از لیست مجاز (
whitelist
) حذف می کند تا در زمانی که Data Saver فعال است، استفاده از داده اندازه گیری شده در پس زمینه را مسدود کند. -
$ adb shell cmd netpolicy list wifi-networks
- تمام شبکههای وایفای را فهرست میکند و نشان میدهد که آیا اندازهگیری شدهاند یا خیر.
-
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
- وای فای را با SSID مشخص شده به عنوان اندازهگیری شده تنظیم میکند و به شما امکان میدهد یک شبکه اندازهگیری شده را در یک شبکه بدون اندازهگیری شبیهسازی کنید.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","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-29 بهوقت ساعت هماهنگ جهانی."],[],[],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."]]