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

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

כשמשתמש מפעיל את התכונה "חוסך הנתונים" בהגדרות והמכשיר מחובר לרשת לפי שימוש, המערכת חוסמת את השימוש בנתונים ברקע ומורה לאפליקציות להשתמש בכמה שפחות נתונים בחזית, ככל האפשר. המשתמשים יכולים לאפשר לאפליקציות ספציפיות להשתמש בנתונים ברקע, גם כשחוסך הנתונים מופעל.

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

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

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

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

הגבלת השימוש בחבילת הגלישה כשהמכשיר מחובר לרשת עם חיוב לפי צריכת נתונים, גם אם חוסך הנתונים מושבת או שהאפליקציה יכולה לעקוף אותו. הקוד לדוגמה הבא משתמש ב-ConnectivityManager.isActiveNetworkMetered() וב-ConnectivityManager.getRestrictBackgroundStatus() כדי לקבוע כמה נתונים האפליקציה צריכה לצרוך:

with(getSystemService(ConnectivityManager::class.java)) {
    // 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.
    }
}

הערה: ב-Android TV ההתנהגות הזו שונה. במקום לחסום את השימוש ברקע, Android TV רק מגביל אותו. כשהאפליקציות פועלות בחזית, הן מוגבלות ל-800Kbps, וכשהן פועלות ברקע, הן מוגבלות ל-10Kbps. אפשר להשתמש ב-ConnectivityManager.isActiveNetworkMetered() כדי לזהות מתי להגביל את השימוש בחבילת הגלישה בטלוויזיה.

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

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

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

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

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

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

בדיקה באמצעות פקודות של Android Debug Bridge

ממשק הגישור של Android‏ (ADB) מספק כמה פקודות שבהן אתם יכולים להשתמש כדי לבדוק את האפליקציה בתנאים של מצב חיסכון בנתונים. אתם יכולים לבדוק ולהגדיר את הרשאות הרשת או להגדיר רשתות אלחוטיות כרשתות לפי שימוש כדי לבדוק את האפליקציה ברשתות ללא הגבלת נפח.

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