אופטימיזציה של השימוש בנתוני הרשת

במהלך חיי הסמארטפון, העלות של חבילת גלישה יכולה להיות קלה עולה על העלות של המכשיר עצמו. ב-Android 7.0 (רמת API 24) וב- גבוהה יותר, משתמשים יכולים להפעיל את חוסך הנתונים (Data Saver) ברמת המכשיר כדי לבצע אופטימיזציה של השימוש בנתונים במכשיר שלהם, ולהשתמש בפחות נתונים. היכולת הזו שימושי במיוחד במהלך נדידה, לקראת סוף מחזור החיובים, או לחבילת נתונים קטנה בתשלום מראש.

כשמשתמש מפעיל את חוסך הנתונים (Data Saver) בהגדרות, והמכשיר ברשת עם חיוב לפי שימוש בנתונים, המערכת חוסמת את השימוש בנתוני רקע ואת האותות כדי להשתמש פחות נתונים בחזית כשהדבר אפשרי. המשתמשים יכולים מאפשרת לאפליקציות ספציפיות להשתמש בשימוש בנתונים עם מכסת נתונים ברקע גם כשנתונים התכונה 'חיסכון' פועלת.

Android 7.0 (רמת API 24) מרחיב את ConnectivityManager ממשק API שנועד לספק לאפליקציות דרך לאחזר את נתוני המשתמש העדפות שמירה ומעקב אחרי ההעדפה שינויים. מומלץ באפליקציות לבדוק אם משתמש הפעיל את חוסך הנתונים (Data Saver) והשקיע מאמץ להגביל את קדמת התמונה שימוש בנתוני רקע.

בדיקת ההעדפות של חוסך הנתונים

ב-Android 7.0 (רמת API 24) ואילך, אפליקציות יכולות להשתמש API של ConnectivityManager כדי לקבוע אילו הגבלות על שימוש בנתונים יחולו. getRestrictBackgroundStatus() הפונקציה מחזירה אחד מהערכים הבאים:

RESTRICT_BACKGROUND_STATUS_DISABLED
חוסך הנתונים מושבת.
RESTRICT_BACKGROUND_STATUS_ENABLED
המשתמש הפעיל חוסך הנתונים (Data Saver) עבור האפליקציה הזו. צריך להשקיע מאמץ כדי להגביל את כמות הנתונים באפליקציות שימוש בחזית וטיפול אלגנטי בהגבלות לרקע על שימוש בחבילת הגלישה.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
המשתמש הפעיל חוסך הנתונים (Data Saver), אבל האפליקציה יכולה לעקוף אותו. צריך בכל זאת להשקיע מאמץ כדי להגביל את השימוש בנתונים בחזית וברקע.

הגבלת השימוש בחבילת הגלישה בכל פעם שהמכשיר מחובר לרשת עם חיוב לפי שימוש בנתונים, גם אם חוסך הנתונים (Data Saver) מושבת או שהאפליקציה מורשית לעקוף אותו. הקוד לדוגמה הבא משתמש 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 Kbps. כשהן פועלות ברקע, אפליקציות מוגבלות ל- 10 Kbps. כדאי להשתמש ConnectivityManager.isActiveNetworkMetered() כדי לזהות מתי להגביל את השימוש בחבילת הגלישה בטלוויזיה.

בקשת הרשאות להגבלת גישה לנתונים

אם האפליקציה צריכה להשתמש בנתונים ברקע, היא יכולה לבקש נתונים להגביל את ההרשאות באמצעות שליחה Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS Intent שמכיל URI של שם החבילה של האפליקציה: לדוגמה, package:MY_APP_ID.

שליחת ה-Intent וה-URI מפעילה את אפליקציית ההגדרות מציג את הגדרות השימוש בנתונים עבור האפליקציה שלך. לאחר מכן המשתמש יכול להחליט אם כדי להפעיל נתוני רקע עבור האפליקציה שלכם. לפני ששולחים את הכוונה הזו, לשאול את המשתמש תחילה אם הוא רוצה להפעיל אפליקציית הגדרות כדי להפעיל נתוני רקע בשימוש.

מעקב אחרי השינויים בהעדפות של חוסך הנתונים

אפליקציות יכולות לעקוב אחר שינויים בהעדפות של חוסך הנתונים (Data Saver) על ידי יצירה של BroadcastReceiver עד האזנה לConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED ובאופן דינמי רישום המקבל באמצעות Context.registerReceiver(). כשאפליקציה מקבלת את השידור הזה, צריך לבדוק אם חוסך הנתונים החדש (Data Saver) החדש. משפיעות על ההרשאות שלו באמצעות קריאה ConnectivityManager.getRestrictBackgroundStatus().

הערה: המערכת שולחת את השידור הזה רק לאפליקציות שנרשמים באופן דינמי באמצעות Context.registerReceiver(). אפליקציות שנרשמו לקבלת השידור הזה במניפסט לא יקבלו אותן.

בדיקה באמצעות פקודות גשר לניפוי באגים ב-Android

הגשר של Android לניפוי באגים (ADB) מספק כמה פקודות שבהן ניתן להשתמש כדי לבדוק את האפליקציה ב-Data Saver את התנאים וההגבלות. אפשר לבדוק ולהגדיר את הרשת או להגדיר רשתות אלחוטיות כרשת עם חיוב לפי שימוש בנתונים כדי לבדוק את האפליקציה שלך במכשירים עם חיוב לפי שימוש בנתונים עמוקה מאוד,

$ adb shell dumpsys netpolicy
יצירת דוח שכולל את רשת הרקע הגלובלית הנוכחית הגדרת ההגבלה, מזהי UID של חבילות שמורשים כרגע לעקוף את חוסך הנתונים (Data Saver) וגם של חבילות ידועות אחרות.
$ adb shell cmd netpolicy
הצגת רשימה מלאה של פקודות Network Policy Manager (netpolicy).
$ adb shell cmd netpolicy set restrict-background <boolean>
המתג מפעיל או משבית את האפשרות Data Saver במהלך העברה של 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
בתיבת ה-Wi-Fi הזו מוצגת רשימה של כל רשתות ה-Wi-Fi, שבהן ניתן לראות אם יש חיוב לפי שימוש בנתונים.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
הגדרת Wi-Fi עם ה-SSID שצוין כרשת עם חיוב לפי שימוש בנתונים, וכך מאפשרת לדמות רשת עם חיוב לפי שימוש בנתונים ברשת שאינה נמדדת לפי שימוש בנתונים.