بهینه سازی استفاده از داده های شبکه

در طول عمر یک تلفن هوشمند، هزینه برنامه داده سلولی می تواند به راحتی از هزینه خود دستگاه بیشتر شود. در 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 مشخص شده به عنوان اندازه‌گیری شده تنظیم می‌کند و به شما امکان می‌دهد یک شبکه اندازه‌گیری شده را در یک شبکه بدون اندازه‌گیری شبیه‌سازی کنید.